解答C++map和set的使用( 三 )

  • 示例:
void testmap1(){ map<int, int> map1;//空构造 int num[] = { 1,5,9,4,8,2,3,1,5,4,5,7 }; for (auto e : num) {map1.insert(make_pair(e,e)); } map<int, int> map2(map1.begin(),map1.end());//迭代区间构造 map<int, int> map3(map2);//拷贝构造 for (auto& e : map3) {cout << e.first << ":" << e.second << endl; }}
  • 结果:

解答C++map和set的使用

文章插图
 

解答C++map和set的使用

文章插图
 
  • 示例:
void testmap2(){ map<int, int> map1;//空构造 int num[] = { 1,5,9,4,8,2,3,1,5,4,5,7 }; for (auto e : num) {//map1.insert(pair<int,int>(e, e));map1.insert(make_pair(e, e));//等同于 } //迭代器正向遍历 auto it1 = map1.begin(); while (it1 != map1.end()) {//cout << (*it1).first << ":"<<(*it1).second<<endl;cout << it1->first << ":"<<it1->second<<endl;//等同于it1++; } //迭代器反向遍历 auto it2 = map1.rbegin(); while (it2 != map1.rend()) {cout << it2->first << ":" << it2->second << endl;//等同于it2++; }}
  • 结果:

解答C++map和set的使用

文章插图
 

解答C++map和set的使用

文章插图
 
  • 解释:
  • 在元素访问时,operator[]通过key找到与key对应的value然后返回其引用,当key不存在时,operator[]用默认value与key构造键值对然后插入,返回该默认value
  • 示例:做统计
void testmap3(){ int arr[] = { 1,4,8,5,9,6,4,2,9,6,4,1,8,5 }; map<int, int, greater<int>> countmap; for (auto e : arr) {countmap[e]++;//当不存在对应key则插入键值pair(e,int()),这里的int()即是0 返回0再++//当存在对应key则返回对应的value,再++ } auto it1 = countmap.begin(); while (it1 != countmap.end()) {//cout << (*it1).first << ":"<<(*it1).second<<endl;cout << it1->first << ":" << it1->second << endl;//等同于it1++; }}
  • 结果:

解答C++map和set的使用

文章插图
 

解答C++map和set的使用

文章插图
 
  • 示例:
void testmap4(){ int num[] = { 1,8,4,5,3,9,2,6,7,4,5 }; map<int,int> map; for (int e : num)//插入 {auto ret = map.insert(make_pair(e,e));if (ret.second == false)cout << e << "插入失败" << endl; } for (auto& e : map)//遍历cout << e.first << ":" << e.second << endl; cout << "count 5:" << map.count(5) << endl; map.erase(map.find(8));//删除 for (auto& e : map)//遍历cout << e.first << ":" << e.second << endl;}
  • 结果:

解答C++map和set的使用

文章插图
 
六、C++中的multimap
  • multimap的介绍:
  • multimap容器与map容器的底层实现以及成员函数的接口都是基本一致,区别是multimap允许键值冗余,即multimap容器当中存储的元素是可以重复的
  • 注意:
  1. 对于find来说multimap返回底层搜索树中序的第一个键值为key的元素的迭代器
  2. 由于multimap容器允许键值冗余,调用[ ]运算符重载函数时,应该返回键值为key的哪一个元素的value的引用存在歧义,因此在multimap容器当中没有实现[ ]运算符重载函数
  • 示例:
void testMmap(){ multimap<int, string> mm; //允许键值冗余 mm.insert(make_pair(2, "two")); mm.insert(make_pair(2, "double")); mm.insert(make_pair(2, "2")); mm.insert(make_pair(2, "second")); mm.insert(make_pair(1, "one")); mm.insert(make_pair(3, "three")); for (auto e : mm) {cout << e.first << ":" << e.second << endl; } cout << endl; //从第一个2找起,遍历到最后一个 auto pos = mm.find(2); while (pos != mm.end() && pos->first == 2) {cout << pos->first << ":" << pos->second << endl;pos++; }}