经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C » 查看文章
c/c++ 标准库 map set 大锅炖
来源:cnblogs  作者:小石王  时间:2018/9/25 20:39:29  对本文有异议

标准库 map set 大锅炖

一,关联容器有哪些

按关键字有序保存元素
map 保存key和value
set 只保存key
mulutimap key可以重复出现
multiset key可以重复出现
无序集合
unordered_map 用哈希函数做成的map
unordered_set 用哈希函数做成的set
unordered_mulutimap key可以重复出现
unordered_multiset key可以重复出现

二,关联容器的类型别名

类型别名 功能描述
key_type 关键字(key)的类型
value_type set的话,和key_type一样;map的话,是个pair
mapped_type 只适用于map,值(value)的类型
  1. set<string>::value_type v1("aa");//v1是string类型
  2. set<string>::key_type v2("bb");//v2是string类型
  3. map<string, int >::value_type v3{"aa",12};//v3是pair<const string,int>类型
  4. map<string, int>::key_type v4("cc");//v4是string类型
  5. //只有map才有mapped_type
  6. map<string, int>::mapped_type v5(100);//v5是int类型

三,关联容器的迭代器

当解一个关联容器的迭代器,会得到一个类型为容器的value_type的值的引用。

  • 解一个map的迭代器,得到的是pair,key是const的,不可以更改。
  • 解一个set的迭代器,得到的是key也是const的,不可以更改。
  1. map<string, int> cnt{{"aa",1}, {"bb",2}};
  2. auto map_it = cnt.begin();
  3. //map_it->first = "new key";//错误,first为const
  4. ++map_it->second;
  5. cout << map_it->second << endl;//2
  6. set<int> iset{1,2,2,3,3,5};
  7. set<int>::iterator set_it = iset.begin();
  8. //*set_it = 10;//错误,不可以改变set的key

四,遍历关联容器

当使用迭代器遍历map,multimap,set,multiset时,迭代器按关键字升序遍历元素。

  1. map<string, int> cnt{{"dd",1}, {"cc",2},{"aa", 10}};
  2. auto map_it = cnt.cbegin();
  3. while(map_it != cnt.cend()){
  4. cout << map_it->first << ":" << map_it->second << endl;
  5. ++map_it;
  6. }
  7. for(auto &s : cnt){
  8. cout << s.first << ":" << s.second << endl;
  9. }

五,对关联容器使用泛型算法

  • 通常不对关联容器使用泛型算法,因为关联容器有key为const特性,很多算法不适用
  • 关联容器可用于只读算法,但是这些算法都需要搜索序列,比如find算法。但是关联容器有关键字,所以还莫不如用关联容器自己的find成员方法来的效率高。
  • 实际中,一般对关联容器,使用copy算法比较多
  1. multiset<string> c{"aa","aa","dd","cc"};
  2. vector<string> v{"ee","ff"};
  3. //copy(v.begin(),v.end(), inserter(c, c.end()));//OK
  4. //copy(v.begin(),v.end(), back_inserter(c));//NG,关联容器没有push_back
  5. //copy(c.begin(),c.end(), inserter(v, v.end()));//OK,并且c的begin到end时拍好序的
  6. copy(c.begin(),c.end(), back_inserter(v));//OK
  7. for(auto &s : c){
  8. cout << s << " ";
  9. }
  10. cout << endl;
  11. for(auto &s : v){
  12. cout << s << " ";
  13. }
  14. cout << endl;

小例子索引

代码块 功能描述
test1 关联容器的别名
test2 解关联容器的迭代器
test3 遍历关联容器
test4 对关联容器通用算法

小例子:

  1. #include <iostream>
  2. #include <map>
  3. #include <set>
  4. #include <vector>
  5. using namespace std;
  6. int main(){
  7. //test1 关联容器的别名
  8. /*
  9. set<string>::value_type v1("aa");//v1是string类型
  10. set<string>::key_type v2("bb");//v2是string类型
  11. map<string, int >::value_type v3{"aa",12};//v3是pair<const string,int>类型
  12. map<string, int>::key_type v4("cc");//v4是string类型
  13. //只有map才有mapped_type
  14. map<string, int>::mapped_type v5(100);//v5是int类型
  15. */
  16. //test2 解关联容器的迭代器
  17. /*
  18. map<string, int> cnt{{"aa",1}, {"bb",2}};
  19. auto map_it = cnt.begin();
  20. //map_it->first = "new key";//错误,first为const
  21. ++map_it->second;
  22. cout << map_it->second << endl;//2
  23. set<int> iset{1,2,2,3,3,5};
  24. set<int>::iterator set_it = iset.begin();
  25. //*set_it = 10;//错误,不可以改变set的key
  26. */
  27. //test3 遍历关联容器
  28. /*
  29. map<string, int> cnt{{"dd",1}, {"cc",2},{"aa", 10}};
  30. map<string, int>::const_iterator map_it = cnt.cbegin();
  31. while(map_it != cnt.cend()){
  32. cout << map_it->first << ":" << map_it->second << endl;
  33. ++map_it;
  34. }
  35. for(auto &s : cnt){
  36. cout << s.first << ":" << s.second << endl;
  37. }
  38. auto it = cnt.begin();
  39. pair<string, int> p1 = *it;
  40. */
  41. //test4 关联容器的通用算法
  42. multiset<string> c{"aa","aa","dd","cc"};
  43. vector<string> v{"ee","ff"};
  44. //copy(v.begin(),v.end(), inserter(c, c.end()));//OK
  45. //copy(v.begin(),v.end(), back_inserter(c));//NG,关联容器没有push_back
  46. //copy(c.begin(),c.end(), inserter(v, v.end()));//OK,并且c的begin到end时拍好\序的
  47. copy(c.begin(),c.end(), back_inserter(v));
  48. for(auto &s : c){
  49. cout << s << " ";
  50. }
  51. cout << endl;
  52. for(auto &s : v){
  53. cout << s << " ";
  54. }
  55. cout << endl;
  56. return 0;
  57. }

github完整代码

c/c++ 学习互助QQ群:877684253

本人微信:xiaoshitou5854

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号