本文结合小紫书总结STL在ACM竞赛中的使用
1.stringstream字符流,和string类型:
string类具有的优点:可以直接用四则运算符和关系运算符,简化了字符串类型的操作。
- string string1="22",string2="11";
- string1+=string2; //类似于strcat
- int length=string1.length(); //类似于strlen,也可以用string.size();
- bool judge=string1>string2; //类类似于strcmp
- #include<iostream>
- #include<string>
- #include<sstream>
- using namespace std;
- int main(void){
- string str;
- stringstream ss;
- while(getline(cin,str)){ //getline函数的返回值是其中的流cin。一旦cin读取错误就是false。
- ss<<str; //将string送入流中。
- int a,sum=0;
- while(ss >> a) sum+=a; //当流里没有东西的时候,退出循环。
- cout<<sum<<endl;
- }
- return 0;
- }
2.模板:
模板是为了,使类或者函数具有通用型,不仅限于一种数据类型或者一种成员结构。
现定义一个可以任意交换类型的模板(注意模板只能在全局或者命名空间内定义,不可以在main函数或者自定义函数内定义。)
- template<class &T> //class为固定关键字,也可以用等效的typename.
- void swap1(T &a,T &b){
- T temp;
- temp=a;
- a=b;
- b=temp;
- }
- vector<int> v;
- v.begin(); //容器的起始位置
- v.end(); //容器最后一个位置
- v.front();v.back(); //返回第一个元素(最后一个元素,但不判断时候存在
- v.empty(); //返回是否容器为空
- v.clear(); //清空容器
- v.erase(m); //删除m位置的数据,并返回下一个数据的地址(m是迭代器)
- v.erase(m,n); //删除m到n之间的数据,并返回下一个数据的地址
- v.push_back(element); //压入一个元素到末端
- v.pop_back(); //弹出最后一个元素
- v.reserve(100);v.resize(101); //resize已经创建空间如果再v.push_back();空间就会到101,而reserve只是预留空间并没有真正创建,v.push_back();只是在第1位
- v.size();v.capacity(); //size表示的是已经创建的空间大小也可以表示元素个数可用v[]的形式直接访问,capacity容器容量,是预留空间并没有实际创建
- swap(a,b); //交换两个元素的位置如:swap(v[0],v[1]);
- vector<int> v(10); //创建一个前十个元素为int的容器
- vector<string> v(10,string("I")); //使容器的前10个元素都为string型,并且都初始化为I
- vector<string> v1(v2); //对于已经存在的v2创建一个v1副本
- v.insert(place,element);
- v.insert(place,n,element); //在place(迭代器)位插入n个元素
- 注:对vector元素的访问可以用类似c语言的v[],但是最好用v.at(),它会检查是否越界更安全
4.集合set(特点是不会存在有重复的元素):
- #include<set>
- set<int> s; //创建一个整型集合:s
- s.insert(element); //插入一个元素,并会自动排序(在没有自定义的情况下,缺省升序排列)
- s.size(); //当前容器中元素个数
- copy(s.begin(), s.end(), ostream_iterator<string>(cout, "\n")); //#include<iterator> 中的函数:输出全部集合中的元素,并在每个元素后面接换行符
5.映射map(关联容器):
- #include<map>
- map<string,int> map1; //创建一个map类型,健(key)为string型,值(value)为int型。是健到值得一种映射。
- map1.insert(pair<string,int>("month",1)); //插入一个元素
- map1["month"]=1; // 插入一个元素
- <span id="transmark">map1.find("month") //查找该健,如果没有找到返回最后一位元素后面的迭代器
- map1.count("month") //查找健"month"出现的次数,但是map中健都是单一且按照升序排列的,只有0和1两中情况
- //因为map在创建的时候是有序的,所以查找效率是:logn。1,000个数据只需10次查找,1.000,000也不过20次查找
- </span>
6.栈stack:
- #include<stack>
- stack<int> stack1; //在是默认以deque为容器的
- stack1.push(element);
- stack1.pop();
- stack1.empty(); //是否为空
- stack1.size(); //元素个数
- stack1.top(); //判断是否为栈顶元素
7.队列queue:
- #include<queue>
- queue<int> queue1;
- queue1.push(element); //加入队列顶部
- queue1.pop(); //弹出队列里第一个元素
- queue1.back(); //队列最后一个元素
- queue1.front(); //队列第一个元素
- queue1.size(); //队列元素个数
- queue1.empty; //队列是否为空
8.优先队列priority_queue:
- #include<queue>
- priority_queue<int,vector<int>,less<int>> pqueue1; //默认容器为vector,其中less算子,表示小的先出队
- priority_queue<int,vector<int>,greater<int>> pqueue1; //大的先出队
- /优先队列与队列相比,只是按照指定的算子将队列内部排序,让后在操作排序后的栈顶元素。<span id="transmark"></span>