C++ STL容器的使用方法(vector、queue、list、set、map)

REF:

区别和api

https://blog.csdn.net/attitude_yu/article/details/81057988

 

1.STL组成:

STL有三大核心部分:容器(Container)、算法(Algorithms)、迭代器(Iterator),容器适配器(containeradaptor),函数对象(functor),除此之外还有STL其他标准组件。通俗的讲:

容器:装东西的东西,装水的杯子,装咸水的大海,装人的教室……STL里的容器是可容纳一些数据的模板类。

算法:就是往杯子里倒水,往大海里排污,从教室里撵人……STL里的算法,就是处理容器里面数据的方法、操作。

迭代器:往杯子里倒水的水壶,排污的管道,撵人的那个物业管理人员……STL里的迭代器:遍历容器中数据的对象。对存储于容器中的数据进行处理时,迭代器能从一个成员移向另一个成员。他能按预先定义的顺序在某些容器中的成员间移动。对普通的一维数组、向量、双端队列和列表来说,迭代器是一种指针。

 

 

容器: 学习list/vector/deque/set/multisets/map/multimaps/

(1)vector:动态数组,向量。(具体用法看代码)

 

[cpp]  view plain  copy
 
  1. #include <iostream>  
  2. #include <stdio.h>  
  3. #include <algorithm>  
  4. #include <string.h>  
  5. #include <queue>  
  6. #include <stack>  
  7. #include <vector>  
  8. #include <list>  
  9. #include <set>  
  10. #include <map>  
  11. using namespace std;  
  12. #define N 10010  
  13. #define LL __int64  
  14.   
  15. typedef vector<int> INTVECTOR;  
  16. typedef deque<int> INTDEQUE;  
  17.   
  18. int main() {  
  19.     freopen("in.in","r",stdin);  
  20.     //freopen("out.out","w",stdout);  
  21.     int n,m;  
  22.     vector <int> vec1;            //vec1初始为空  
  23.     vector <int> vec2(10,6);  //vec2最初由10个值为6的元素  
  24.     vector <int> vec3(vec2.begin(),vec2.begin()+3); //vec3最初由3个值为6的元素。  
  25.     //声明迭代器  
  26.     vector<int> ::iterator i;  
  27.   
  28.     //从前向后显示vec1中的数据 :迭代器输出使用 *i  
  29.     cout<<"vec1.begin()---vec1.end():"<<endl;  
  30.     for(i=vec1.begin();i!=vec1.end();i++){  
  31.         cout<<*i<<" ";  
  32.     }cout<<endl;  
  33.   
  34.     //测试添加和插入成员函数(注意:vector不支持从前插入)  
  35.     vec1.push_back(2);  //从后面添加一个成员  
  36.     vec1.push_back(4);  
  37.     vec1.insert(vec1.begin()+1,5); //在vec1的第一个位置上插入成员5  
  38.     vec1.insert(vec1.begin()+1,vec3.begin(),vec3.end()); //在vec1的第一个位置上插入vec3的所有成员  
  39.   
  40.     //测试赋值成员函数(重新给vector中的某一位上的元素赋值)  
  41.     vec2.assign(8,1);  //vec2的8个成员初始值设为1  
  42.   
  43.     //访问vector数组中的某一位置上的元素  
  44.     cout<<vec2[2]<<endl;  
  45.   
  46.     //删除和移出  
  47.     vec1.pop_back();   //删除vec1的最后一个元素  
  48.     vec1.erase(vec1.begin()+1,vec1.end()-2);  
  49.   
  50.     cout<<"vec.pop_back() and vec1.erase():"<<endl;  
  51.     for(i=vec1.begin();i!=vec1.end();i++)  
  52.         cout<<*i<<" ";  cout<<endl;  
  53.   
  54.     //显示序列消息:vector中数组也是从 0 ~ vec1.size(),左闭右开  
  55.   
  56.     //获取vector的大小:  vec1.size();  
  57.     //清空vector:  vec1.clear();  
  58.     vec1.clear();  
  59.     cout<<"vec1.empty():"<<endl;  
  60.         for(i=vec1.begin();i!=vec1.end();i++)  
  61.             cout<<*i<<" ";  cout<<endl;  
  62.   
  63.     return 0;  
  64. }  

 

 

 

(2)queue:双端队列:支持vector不支持的push_front();

 

[cpp]  view plain  copy
 
  1. void put_deque(INTDEQUE deque,char *name){  
  2.     INTDEQUE::iterator pdeque;  //定义迭代器输出  
  3.     cout<<"The contents of "<<name<<" : ";  
  4.     for(pdeque = deque.begin();pdeque!=deque.end();pdeque++){  
  5.         cout<<*pdeque<<" ";  
  6.     }cout<<endl;  
  7. }  
  8. int main(){  
  9.     //测试deque的各种函数功能  
  10.     INTDEQUE deq1;  
  11.     INTDEQUE deq2(10,6);  
  12.     INTDEQUE:: iterator i;  
  13.   
  14.     //末尾插入元素并打印  
  15.     deq1.push_back(2);  
  16.     deq1.push_back(4);  
  17.     put_deque(deq1,"deq1");  
  18.   
  19.     //前面添加两个元素  
  20.     deq1.push_front(5);  
  21.     deq1.push_front(7);  
  22.     put_deque(deq1,"deq1");  
  23.   
  24.     //中间插入数据  
  25.     deq1.insert(deq1.begin()+1,3,9);  //插入三个9  
  26.     put_deque(deq1,"deq1");  
  27.   
  28.     //数据访问:都表示下坐标  
  29.     cout<<deq1[1]<<" "<<deq1.at(5)<<endl;  
  30.   
  31.     //数据删除:从前后,以及按位置删除  
  32.     //deq1.pop_front();  
  33.     //deq1.pop_back();  
  34.     deq1.erase(deq1.begin()+4); //删除下坐标为4的数。  
  35.     put_deque(deq1,"deq1");  
  36.   
  37.     //数据修改  
  38.     deq1.assign(8,1);   //全部赋值为了1  
  39.     put_deque(deq1,"deq1");  
  40.   
  41.     deq1.clear();  //清空deque  
  42.     put_deque(deq1,"deq1");  
  43.   
  44.     return 0;  
  45. }  

 

 

 

 

(3)list:链表,双向链表,只能顺序访问,不能使用[]进行随机访问

 

[cpp]  view plain  copy
 
  1. void printList(list<int> n){  
  2.     for(list<int>::iterator i=n.begin();i!=n.end();i++)  
  3.         cout<< *i << " ";  
  4.     cout<<endl;  
  5. }  
  6. int main(){  
  7.     list<int> list1,list2;  
  8.     list1.push_back(123);  
  9.     list1.push_back(0);  
  10.     list1.push_back(34);  
  11.   
  12.     list2.push_back(100);  
  13.     list2.push_back(12);  
  14.   
  15.     //测试list排序功能  
  16.     printList(list1);  
  17.     list1.sort();  
  18.     printList(list1);  
  19.   
  20.     list2.sort();  
  21.     list1.merge(list2);  //两个链表排序后进行合并,合并完仍然有序  
  22.     printList(list1);  
  23.   
  24.     return 0;  
  25. }  

 

 

 

 

(4)set和multisets:集和多集:默认是排好序的!

·set:包含元素唯一

·multisets:包含元素可不唯一

 

[cpp]  view plain  copy
 
  1. int main(){  
  2.     set<int> set1;  
  3.     for(int i=0;i<10;i++) set1.insert(i);  
  4.     for(set<int>::iterator p = set1.begin();p!=set1.end();p++){  
  5.         cout<<*p<<" ";  
  6.     }cout<<endl;  
  7.   
  8.     //计算set中值为2的元素个数  
  9.     cout<<set1.count(2)<<endl;  
  10.   
  11.     //插入元素:可重复  
  12.     multiset<int> A;  
  13.     A.insert(set1.begin(),set1.end());  
  14.     A.insert(4);  //插入之后默认排好序  
  15.     for(multiset<int>::iterator i=A.begin();i!=A.end();i++)  
  16.         cout<<*i<<" "; cout<<endl;  
  17.     return 0;  
  18. }  

 

 

 

 

(5)map和multimaps:映射和多重映射

set中的key和value是Key类型的,而map中的key和value是一个pair结构中的两个分量。Map支持下表运算符operator[],用访问普通数组的方式访问map,不过下标为map的键。在multimap中一个键可以对应多个不同的值。

 

[cpp]  view plain  copy
 
  1. int main(){  
  2.     //定义map: char是键的类型,int是值的类型  
  3.     map<char,int,less<char> > map1;  
  4.     map<char,int,less<char> >::iterator mapIter;  
  5.     //注意这里: 两个>>符号之间 要有一个空格  
  6.   
  7.     //初始化  
  8.     map1['c'] = 3;  
  9.     map1['d'] = 4;  
  10.     map1['a'] = 1;  
  11.   
  12.     //打印  
  13.     for(mapIter=map1.begin();mapIter!=map1.end();mapIter++){  
  14.         cout<<" "<<(*mapIter).first<<" : "<<(*mapIter).second;  
  15.     }cout<<endl;//其中first对应定义中的char键,second对应定义中的int  
  16.   
  17.     //检索  
  18.     map<char,int ,less<char> >::const_iterator t = map1.find('d');  
  19.     cout<<"t:"<<(*t).first<<"对应值:"<<(*t).second<<endl;  
  20.   
  21.     cout<<map1['d']<<endl<<endl; //也可以直接这样访问  
  22.   
  23.     //-----------------------multimap------------------------  
  24.     multimap<string,string,less<string> >mulmap;  
  25.     multimap<string,string,less<string> >::iterator p;  
  26.     typedef multimap<string,string,less<string> >::value_type vt;  
  27.   
  28.     //注意multimap中不支持map中的[]下标操作!!!  
  29.     //mulmap[string("songjs")] = string("bjfu"); --- 是错误的  
  30.     mulmap.insert(vt(string("songjs"),string("is a boy")));  
  31.     mulmap.insert(vt(string("songjs"),string("is a girl")));  
  32.     //打印输出  
  33.     for(p=mulmap.begin();p!=mulmap.end();p++){  
  34.         cout<<(*p).first<<" "<<(*p).second<<endl;  
  35.     }  
  36.   
  37.     return 0;  
  38. }  

 

注:

 

1.对于set和map容器,key需要有<操作符或者自定义比较函数

map在STL中的定义

template <class Key, class T, class Compare = less<Key>, class Alloc = alloc>

 第一个参数Key是关键字类型

第二个参数T是值类型

第三个参数Compare是比较函数(仿函数)

第四个参数是内存配置对象

map内部存储机制实际是以红黑树为基础,红黑树在插入节点时,必须依照大小比对之后在一个合适的位置上执行插入动作。所以作为关键字,起码必须有“<”这个比较操作符。我们知道,int,float,enum,size_t等等简单关键字,都有内置的比较函数,与map搭配无论是插入还是查找,都没什么问题。但是作为复杂数据类型,如果没有明确定义“<”比较操作符,就不能与map直接搭配使用,除非我们自己定义第三个参数。

在选择map的关键字时,注意以下两点,同时这两点也是改错的方法:

a) 关键字明确定义“<”比较操作符

b) 没有“<”比较操作符,自定义仿函数替代第三个参数Compare,该仿函数实现“()”操作符,提供比较功能。插入时各节点顺序以该仿函数为纲。

https://blog.csdn.net/zhubaohua_bupt/article/details/62036499

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值