STL在ACM竞赛中的使用

本文结合小紫书总结STL在ACM竞赛中的使用

1.stringstream字符流,和string类型:

string类具有的优点:可以直接用四则运算符和关系运算符,简化了字符串类型的操作。

[cpp]  view plain copy print ?
  1. string string1="22",string2="11";  
  2. string1+=string2;    //类似于strcat  
  3. int length=string1.length();   //类似于strlen,也可以用string.size();  
  4. bool judge=string1>string2;    //类类似于strcmp  
小紫书中例代码详解:

[cpp]  view plain copy print ?
  1. #include  
  2. #include  
  3. #include  
  4. using namespace std;  
  5.   
  6. int main(void){  
  7.     string str;  
  8.     stringstream ss;  
  9.     while(getline(cin,str)){ //getline函数的返回值是其中的流cin。一旦cin读取错误就是false。  
  10.         ss<//将string送入流中。  
  11.         int a,sum=0;  
  12.         while(ss >> a) sum+=a;     //当流里没有东西的时候,退出循环。  
  13.         cout<
  14.     }  
  15.     return 0;  
  16. }  

2.模板:

          模板是为了,使类或者函数具有通用型,不仅限于一种数据类型或者一种成员结构。

          现定义一个可以任意交换类型的模板(注意模板只能在全局或者命名空间内定义,不可以在main函数或者自定义函数内定义。

[cpp]  view plain copy print ?
  1. template<class &T>    //class为固定关键字,也可以用等效的typename.  
  2. void swap1(T &a,T &b){  
  3.     T temp;  
  4.     temp=a;  
  5.     a=b;  
  6.     b=temp;  
  7.  }  
3. 容器vector:
[cpp]  view plain copy print ?
  1. vector<int> v;  
  2. v.begin();   //容器的起始位置  
  3. v.end();    //容器最后一个位置  
  4. v.front();v.back();   //返回第一个元素(最后一个元素,但不判断时候存在  
  5. v.empty();    //返回是否容器为空  
  6. v.clear();    //清空容器  
  7. v.erase(m);    //删除m位置的数据,并返回下一个数据的地址(m是迭代器)  
  8. v.erase(m,n);     //删除m到n之间的数据,并返回下一个数据的地址  
  9. v.push_back(element);    //压入一个元素到末端  
  10. v.pop_back();    //弹出最后一个元素  
  11. v.reserve(100);v.resize(101);    //resize已经创建空间如果再v.push_back();空间就会到101,而reserve只是预留空间并没有真正创建,v.push_back();只是在第1位  
  12. v.size();v.capacity();       //size表示的是已经创建的空间大小也可以表示元素个数可用v[]的形式直接访问,capacity容器容量,是预留空间并没有实际创建  
  13. swap(a,b);      //交换两个元素的位置如:swap(v[0],v[1]);  
  14. vector<int>  v(10);    //创建一个前十个元素为int的容器  
  15. vector v(10,string("I"));  //使容器的前10个元素都为string型,并且都初始化为I  
  16. vector v1(v2);    //对于已经存在的v2创建一个v1副本  
  17. v.insert(place,element);  
  18. v.insert(place,n,element);     //在place(迭代器)位插入n个元素  
  19. 注:对vector元素的访问可以用类似c语言的v[],但是最好用v.at(),它会检查是否越界更安全  
总结:vector即具有数组的特性由增加了一些功能十分好,简化代码的函数,还可以通过原生的v.push_back()动态增加长度,十分好用。

4.集合set(特点是不会存在有重复的元素):

[cpp]  view plain copy print ?
  1. #include  
  2. set<int> s;     //创建一个整型集合:s  
  3. s.insert(element);     //插入一个元素,并会自动排序(在没有自定义的情况下,缺省升序排列)  
  4. s.size();     //当前容器中元素个数  
  5. copy(s.begin(), s.end(), ostream_iterator(cout, "\n"));    //#include 中的函数:输出全部集合中的元素,并在每个元素后面接换行符  

5.映射map(关联容器):

[cpp]  view plain copy print ?
  1. #include  
  2. mapint> map1;    //创建一个map类型,健(key)为string型,值(value)为int型。是健到值得一种映射。  
  3. map1.insert(pairint>("month",1));     //插入一个元素  
  4. map1["month"]=1;   // 插入一个元素  
  5. "transmark">map1.find("month")    //查找该健,如果没有找到返回最后一位元素后面的迭代器  
  6. map1.count("month")    //查找健"month"出现的次数,但是map中健都是单一且按照升序排列的,只有0和1两中情况  
  7. //因为map在创建的时候是有序的,所以查找效率是:logn。1,000个数据只需10次查找,1.000,000也不过20次查找  
  8.   

6.栈stack:

[cpp]  view plain copy print ?
  1. #include  
  2. stack<int> stack1;     //在是默认以deque为容器的  
  3. stack1.push(element);  
  4. stack1.pop();      
  5. stack1.empty();    //是否为空  
  6. stack1.size();     //元素个数  
  7. stack1.top();    //判断是否为栈顶元素  

7.队列queue:

[cpp]  view plain copy print ?
  1.  #include  
  2.         queue<int> queue1;  
  3.         queue1.push(element);    //加入队列顶部  
  4.         queue1.pop();    //弹出队列里第一个元素  
  5.         queue1.back();    //队列最后一个元素  
  6.         queue1.front();    //队列第一个元素  
  7.         queue1.size();    //队列元素个数  
  8.         queue1.empty;    //队列是否为空  

8.优先队列priority_queue:

[cpp]  view plain copy print ?
  1. #include  
  2. priority_queue<int,vector<int>,less<int>> pqueue1;    //默认容器为vector,其中less算子,表示小的先出队  
  3. priority_queue<int,vector<int>,greater<int>> pqueue1;    //大的先出队  
  4. /优先队列与队列相比,只是按照指定的算子将队列内部排序,让后在操作排序后的栈顶元素。"transmark">  

你可能感兴趣的:(c++)