C++:set和map的使用

打印 上一主题 下一主题

主题 817|帖子 817|积分 2451

目录
序列式容器和关联式容器
set
set类的介绍
构造和迭代器
增删查
insert
find和erase
erase迭代器失效
lower_bound与upper_bound
multiset和set的区别
map
map类的介绍
pair类型介绍
构造和迭代器
增删查
map数据修改:重载operator[]
multimap和map的区别

序列式容器和关联式容器

一样平常来说,像string、vector、list、deque、forward_list等容器,这些容器的底层逻辑机构为线性序列的数据结构,所以这些容器也叫做序列式容器,序列式容器两个位置存储的值之间一样平常没有精密的关联关系,如若将其互换,依旧是序列式容器。序列式容器中的元素是按他们在容器中的存储位置保存和访问的。
与之相反,关联式容器逻辑结构通常是非线性的两个位置有精密的关联关系,不答应互换,因为会破坏存储结构。关联式容器中的元素是按照关键字来保存和访问的。
关联式容器有map/set系列unordered_set/unordered_map系列map和set的底层是红黑树(二叉搜索树)set是key搜索场景的结构map是key/value搜索场景的结构
set

set类的介绍

  1. template < class T,                    // set::key_type/value_type
  2.                class Compare = less<T>,    // set::key_compare/value_compare
  3.                class Alloc = allocator<T>  // set::allocator_type 空间配置器
  4.            > class set;
复制代码
说明:
1.T就是set底层关键字key的类型。
2。set默认支持(不传参)是小于比力,假如有需求,可更改传入的仿函数。
3.set底层存储数据的内存是从空间配置器申请的,假如有特别需要可以本身实现内存池传入。
4.一样平常而言,我们只需传入第一个参数,后两个参数不需要手动传。
5.set的底层是红黑树增删查的效率是O(logN),迭代且走的是树的中序遍历,得到的结果是有序的。
  1. template < class T,                    // set::key_type/value_type
  2.                class Compare = less<T>,    // set::key_compare/value_compare
  3.                class Alloc = allocator<T>  // set::allocator_type 空间配置器
  4.            > class set;
  5.            //1.单个数据插入,如果已经存在则插入失败
  6. pair<iterator, bool> insert(const value_type& val);
  7. //2.列表插入,已经在容器中存在的值不会插入
  8. void insert(initializer_list<value_type> il);
  9. //3.迭代器区间插入,已经在容器中存在的值不会插入
  10. template <class InputIterator>
  11. void insert(InputIterator first, InputIterator last);
  12. //查找val,返回val所在的迭代器,没有找到返回end() iterator find(const value_type& val);//查找val,返回Val的个数 size_type count(const value_type& val) const;//1.删除一个迭代器位置的值 iterator erase(const_iterator position);//2.删除val,val不存在返回0,存在返回1 size_type erase(const value_type& val);//3.删除一段迭代器区间的值 iterator erase(const_iterator first, const_iterator last);//返回大于等于val位置的迭代器 iterator lower_bound(const value_type& val) const;//返回大于val位置的迭代器 iterator upper_bound(const value_type& val) const;
复制代码
set是key结构, map才是key/value结构, 这里的key_type和value_type是为了保持与map一致,所以才有了value_type,在set中其实就是key,固然key_type也是key。
构造和迭代器

 1.set的构造有无参默认构造迭代器区间构造拷贝构造列表构造
2.set的迭代器是双向迭代器,支持正向和反向遍历,但要注意的是,无法通过迭代器修改数据,如许会破坏搜索树的结构。
  1. void test_set1()
  2. {
  3.         vector<int> v({1,5,4,2,3,6,7,8,9});
  4.        
  5.         set<int> s1;                          //无参认构造
  6.         set<int> s2(v.begin(), v.end());      //迭代器区间构造
  7.         set<int> s3(s2);                      //拷贝构造
  8.         set<int> s = { 1,5,4,2,3,6,7,8,9 };   //列表初始化构造
  9.         //1.正向迭代器
  10.         for (auto e : s2)
  11.         {
  12.                 cout << e << " ";
  13.         }
  14.         cout << endl;
  15.        
  16.         //set<int>::iterator it = s2.begin();
  17.         auto it = s2.begin();
  18.         while (it != s2.end())
  19.         {
  20.                 cout << *it << " ";
  21.                 ++it;
  22.         }
  23.         cout << endl;
  24.         //2.set是双向迭代器迭代器支持++/--,但是不是随机迭代器不支持+/-
  25.         it = --s2.end();
  26.         auto end = --s2.begin();
  27.         while (it != end)
  28.         {
  29.                 cout << *it << " ";
  30.                 --it;
  31.         }
  32.         cout << endl;
  33.         //3.反向迭代器
  34.         //auto rit = s2.rbegin();
  35.         set<int>::reverse_iterator rit = s2.rbegin();
  36.         while (rit != s2.rend())
  37.         {
  38.                 cout << *rit << " ";
  39.                 ++rit;       
  40.         }
  41.         cout << endl;
  42. }
复制代码
增删查

set支持增删查,但不支持修改,会破坏红黑树的结构。
set不支持插入雷同的数据,但是multiset支持插入雷同的数据。
insert

  1. //1.单个数据插入,如果已经存在则插入失败
  2. pair<iterator, bool> insert(const value_type& val);
  3. //2.列表插入,已经在容器中存在的值不会插入
  4. void insert(initializer_list<value_type> il);
  5. //3.迭代器区间插入,已经在容器中存在的值不会插入
  6. template <class InputIterator>
  7. void insert(InputIterator first, InputIterator last);
复制代码
删除具体的值返回size_type而不是bool是为了与multiset保持一致,multiset含有重复数据(比方:multiset中有3个5,若要删除5,则返回值就是3) 
  1. void test_set2()
  2. {
  3.         vector<int> v({ 7,6,8 });
  4.         //1.单个数据插入,如果已经存在则插入失败
  5.         set<int> s1;
  6.         s1.insert(3);
  7.         s1.insert(3);
  8.         s1.insert(1);
  9.         s1.insert(2);
  10.         //2.插入列表,同理如果已经存在则该数据插入失败
  11.         s1.insert({ 4, 6, 5, 4 });
  12.         //3.插入迭代器区间
  13.         s1.insert(v.begin(), v.end());
  14.         set<int> s2;
  15.         s2.insert(3);
  16.         s2.insert(2);
  17.         s2.insert(1);
  18.         s2.insert(5);
  19.         s2.insert(4);
  20.         s2.insert(5);
  21.         set<int>::iterator it = s2.begin();
  22.         while (it != s2.end())
  23.         {
  24.                 cout << *it << " "; //输出1 2 3 4 5
  25.                 ++it;
  26.         }
  27.         cout << endl;
  28.         //单参数支持隐式类型转换:构造tmp+用tmp拷贝构造strs1——>优化为直接构造strs1
  29.         set<string> strs1 = { "white", "blue", "black" };
  30.         //调用默认构造
  31.         set<string> strs2({ "white", "blue", "black" });
  32.         //遍历strs1比较ascll码大小顺序遍历的
  33.         for (auto& e : strs1)
  34.         {
  35.                 cout << e << " ";
  36.         }
  37.         cout << endl;
  38. }
复制代码
find和erase

find在算法库也有,实用于各种容器,时间复杂度为O(n)。
  1. auto pos1 = find(s.begin(), s.end(), x);
复制代码
set本身的find是利用二叉搜树进行查找,时间复杂度 O(logN)
  1. auto pos2 = s.find(x);
复制代码
  1. //1.删除一个迭代器位置的值
  2. iterator erase (const_iterator position);
  3. //2.删除val,val不存在返回0,存在返回1
  4. size_type erase (const value_type& val);
  5. //3.删除⼀段迭代器区间的值
  6. iterator erase (const_iterator first, const_iterator last);
  7. //查找val,返回val所在的迭代器,没有找到返回end()
  8. iterator find (const value_type& val);
  9. //查找val,返回Val的个数
  10. size_type count (const value_type& val) const;
复制代码
  1. void test_set3()
  2. {
  3.         set<int> s = { 3, 2, 1, 5, 6, 7, 8, 9 , 11, 13, 12, 15, 14};
  4.         //1.迭代器删除最小值
  5.         s.erase(s.begin());
  6.         //2.删除具体的值val:底层就是find+迭代器删除
  7.         int x;
  8.         cin >> x;
  9.         int num = s.erase(x);
  10.         if(num)
  11.             cout << x << "删除成功!" << endl;
  12.         else
  13.                 cout << x << "不存在!" << endl;
  14.         //3.删除一段迭代器区间的值,注意是左闭右开区间
  15.         auto first = s.find(5);
  16.         auto last = s.find(7);
  17.         s.erase(first, last);
  18.         for (auto e : s)
  19.                 cout << e << " ";
  20.         cout << endl;
  21.         //find+迭代器删除
  22.         int y;
  23.         cin >> y;
  24.         //找到返回该值的迭代器,找不到返回s.end()
  25.         auto pos = s.find(y);
  26.         if (pos != s.end())
  27.                 s.erase(pos);
  28.         else
  29.                 cout << y << "不存在!" << endl;
  30.         //利用count间接实现快速查找
  31.         int z;
  32.         cin >> z;
  33.         if(s.count(z))
  34.                 cout << z << "存在!" << endl;
  35.         else
  36.                 cout << z << "不存在!" << endl;
  37. }
复制代码
erase迭代器失效

  1. void test_set4()
  2. {
  3.         set<int> s = { 1, 3, 4 ,6, 5, 2 };
  4.         auto pos = s.find(4);
  5.         //pos位置的迭代器失效
  6.         //s.erase(pos);
  7.         //cout << *pos << endl; //强行访问导致程序崩溃
  8.        
  9.         //正确做法,erase会返回删除元素的下一个元素,更新pos
  10.         pos = s.erase(pos);
  11.         //4的下一个元素是5
  12.         cout << *pos << endl;
  13.         //注意,若查找的是6的话,那么删除6后迭代器pos就变成了s.end(),此时访问程序崩溃
  14. }
复制代码
lower_bound与upper_bound

  1. //返回大于等于val位置的迭代器:按照搜索树的规则找
  2. iterator lower_bound(const value_type& val) const;
  3. //返回大于val位置的迭代器:按照搜索树的规则找
  4. iterator upper_bound(const value_type& val) const;
复制代码
  1. void test_set5()
  2. {
  3.         set<int> s1;
  4.         for (int i = 1; i < 10; i++)
  5.         {
  6.                 s1.insert(i * 10); //10 20 30 40 50 60 70 80 90
  7.         }
  8.         set<int> s2(s1);
  9.         cout << endl;
  10.         //要求:删除[30, 60]区间的值
  11.         //1.erase的迭代器区间删除左闭右开:[)
  12.         auto first = s1.find(30);
  13.         auto last = s1.find(70);
  14.         s1.erase(first, last);
  15.         for (auto e : s1)
  16.         {
  17.                 cout << e << " "; //10 20 70 80 90
  18.         }
  19.         cout << endl;
  20.         //要求:删除[25, 55]区间的值,那就要找到30 60位置的迭代器,但上面的方法无效,因为find查找不到,返回的是s.end()迭代器
  21.         //此时需要用到lower_bound和upper_bound
  22.         auto itlow = s2.lower_bound(25); //返回 >= 25的迭代器:就是30位置的迭代器
  23.         auto itup = s2.upper_bound(55);  //返回 > 55的迭代器:就是60位置的迭代器
  24.         s2.erase(itlow, itup);
  25.         for (auto e : s2)
  26.         {
  27.                 cout << e << " "; //10 20 60 70 80 90
  28.         }
  29.         cout << endl;
  30.        
  31. }
复制代码
multiset和set的区别

multiset与set的使用基本类似,紧张区别在于multiset支持冗余插入,那么insert/find/count/erase就会有所区别。
  1. void test_set6()
  2. {
  3.         //相比set不同的是,multiset是排序,但是不去重
  4.         multiset<int> mulset = { 4,2,7,2,4,8,4,5,4,9 };
  5.         auto it = mulset.begin();
  6.         while (it != mulset.end())
  7.         {
  8.                 cout << *it << " "; //输出:2 2 4 4 4 4 5 7 8 9
  9.                 ++it;
  10.         }
  11.         cout << endl;
  12.         //x可能会存在多个,find查找中序的第一个
  13.         int x;
  14.         cin >> x;
  15.         auto pos = mulset.find(x);
  16.         while (pos != mulset.end() && *pos == x)
  17.         {
  18.                 cout << *pos << " ";
  19.                 ++pos;
  20.         }
  21.         cout << endl;
  22.         //count会返回x的实际个数
  23.         cout << mulset.count(x) << endl;
  24.         //erase给值时会删除所有的x
  25.         mulset.erase(x);
  26.         for (auto e : mulset)
  27.         {
  28.                 cout << e << " ";
  29.         }
  30.         cout << endl;
  31.        
  32. }
复制代码
map

map类的介绍

  1. template < class Key,                                     // map::key_type
  2.            class T,                                       // map::mapped_type
  3.            class Compare = less<Key>,                     // map::key_compare
  4.            class Alloc = allocator<pair<const Key,T> >    // map::allocator_type
  5.            > class map;
复制代码
1.Key就是map底层关键字声明,T就是map底层value的类型。
2.map默认要求Key支持小于比力,如若需要,可以手动传仿函数。
3.map底层存储数据的内存是从空间配置器申请的。
4。map底层也是红黑树,增删查改的效率是O(logN) ,注意,这里的改指的是修改ValueKey是不能修改的。
pair类型介绍

  1. template <class T1, class T2>
  2. struct pair
  3. {
  4.         T1 first;
  5.         T2 second;
  6.         //无参默认构造
  7.         pair()
  8.                 :first(T1())
  9.                 ,second(T2())
  10.         {}
  11.         pair(const T1& a, const T2& b)
  12.                 :first(a)
  13.                 ,second(b)
  14.         {}
  15.         //拷贝构造
  16.         template<class U, class V>
  17.         pair(const pair<U, V>& pr)
  18.                 :first(pr.first)
  19.                 ,second(pr.second);
  20.         {}
  21. };
  22. //创建pair对象
  23. template <class T1, class T2>
  24. inline ::pair<T1, T2> make_pair(T1 x, T2 y)
  25. {
  26.         return pair<T1, T2>(x, y);
  27. }
复制代码
  1. Member types
  2. key_type        ->  The first template parameter (Key)       
  3. mapped_type        ->  The second template parameter (T)       
  4. value_type        ->  pair<const key_type,mapped_type>
复制代码
map是key/value搜索场景的结构,key_type就是key,而mapped_type就是value,而value_type才是pair。
构造和迭代器

1.mapt的构造有无参默认构造迭代器区间构造拷贝构造列表构造
2.map支持正向和反向迭代,遍历默认是升序。
  1. //empty (1) 无参默认构造
  2. explicit map(const key_compare& comp = key_compare(),
  3.                  const allocator_type& alloc = allocator_type());
  4. //range (2) 迭代器区间构造
  5. template <class InputIterator>
  6. map(InputIterator first, InputIterator last,
  7.         const key_compare& comp = key_compare(),
  8.         const allocator_type & = allocator_type());
  9. //copy (3) 拷贝构造
  10. map(const map& x);
  11. //initializer list (4) initializer 列表构造
  12. map(initializer_list<value_type> il,
  13.         const key_compare& comp = key_compare(),
  14.         const allocator_type& alloc = allocator_type());
  15. //迭代器是一个双向迭代器
  16. iterator->a bidirectional iterator to const value_type
  17. //正向迭代器
  18. iterator begin();
  19. iterator end();
  20. //反向迭代器
  21. reverse_iterator rbegin();
  22. reverse_iterator rend();
复制代码
  1. void test_map1()
  2. {
  3.         //无参默认构造
  4.         map<int, int> m1;
  5.         //迭代器区间构造
  6.         vector<pair<int, int>> v = { {1,1}, {2, 2}, {3, 3} };
  7.         map<int, int> m2(v.begin(), v.end());
  8.         //拷贝构造
  9.         map<int, int> m3(m2);
  10.         //列表初始化构造
  11.         map<int, int> m4 = { {1,1}, {2, 2}, {3, 3}, { 4, 4} };
  12.         //1.正向迭代器
  13.         //map<int, int>::iterator it = m4.begin();
  14.         auto it = m4.begin();
  15.         while (it != m4.end())
  16.         {
  17.                 cout << it->first << " " << it->second << endl;
  18.                 ++it;
  19.         }
  20.         cout << endl;
  21.         //2.反向迭代器
  22.         auto rit = m4.rbegin();
  23.         while (rit != m4.rend())
  24.         {
  25.                 cout << rit->first << " " << rit->second << endl; //输出:1 2 1 2
  26.                 ++rit;
  27.         }
  28.         cout << endl;
  29. }
复制代码
增删查

  1. Member types
  2. key_type        ->  The first template parameter (Key)        //key
  3. mapped_type        ->  The second template parameter (T)        //value
  4. value_type        ->  pair<const key_type,mapped_type>    //pair
  5. //单个数据插入,如果已经key存在则插入失败,key存在相等value不相等也会插入失败
  6. pair<iterator, bool> insert(const value_type& val);
  7. //列表插入,已经在容器中存在的值不会插入
  8. void insert(initializer_list<value_type> il);
  9. //迭代器区间插入,已经在容器中存在的值不会插入
  10. template <class InputIterator>
  11. void insert(InputIterator first, InputIterator last);
  12. //查找k,返回k所在的迭代器,没有找到返回end()
  13. iterator find(const key_type& k);
  14. //查找k,返回k的个数
  15. size_type count(const key_type& k) const;
  16. //删除一个迭代器位置的值
  17. iterator erase(const_iterator position);
  18. //删除k,k存在返回0,存在返回1
  19. size_type erase(const key_type& k);
  20. //删除一段迭代器区间的值
  21. iterator erase(const_iterator first, const_iterator last);
  22. //返回大于等于k位置的迭代器
  23. iterator lower_bound(const key_type& k);
  24. //返回大于k位置的迭代器
  25. const_iterator upper_bound(const key_type& k) const;
复制代码
  1. void test_map2()
  2. {
  3.         map<string, string> dict;
  4.         //插入有名对象
  5.         pair<string, string> kv1("first", "第一");
  6.         dict.insert(kv1);
  7.         //插入匿名对象
  8.         dict.insert(pair<string, string>("second", "第二"));
  9.         //利用make_pair函数返回构造的pair对象,插入
  10.         dict.insert(make_pair("third", "第三"));
  11.         //C++11支持多参数隐式类型转换成pair对象,插入
  12.         dict.insert({ "forth", "第四" });
  13.         //"forth"已经存在,插入失败
  14.         dict.insert({ "forth", "第四" });
  15.         auto it = dict.begin();
  16.         while (it != dict.end())
  17.         {
  18.                 cout << (*it).first << " " << (*it).second << endl;
  19.                 //map的迭代基本都使用operator->,这里省略了一个->
  20.                 //第一个->是迭代器运算符重载,返回pair*,第二个箭头是结构指针解引用取pair数据
  21.                 cout << it->first << " " << it->second << endl;
  22.                 ++it;
  23.                 //it->first += 'x';   //key不支持修改
  24.                 //it->second += 'x'; // value支持修改
  25.         }
  26.         cout << endl;
  27.         for (auto& e : dict)
  28.         {
  29.                 cout << e.first << " " << e.second << endl;
  30.         }
  31.         cout << endl;
  32.         string str;
  33.         while (cin >> str)
  34.         {
  35.                 auto ret = dict.find(str);
  36.                 if (ret != dict.end())
  37.                 {
  38.                         cout << "->" << ret->second << endl;
  39.                 }
  40.                 else
  41.                 {
  42.                         cout << "无此单词,请重新输入" << endl;
  43.                 }
  44.         }
  45.         //erase与set中的erase一模一样,就不做演示了
  46. }
复制代码
关于insert这个函数,它返回的是一个pair,但这pair不是map里的pair,insert返回的pair的key是map的迭代器,value是一个bool值。当你插入一个{key,value}的时候,假如插入乐成返回的pair的迭代器是指向新节点的bool值为真;当插入雷同值的时候,也就是插入失败的时候,返回的pair的迭代器指向的是与插入{key,value}的key相称的节点bool值为假
所以这个insert既有插入的功能也有查找的功能。
map数据修改:重载operator[]

map支持修改value,既可以通过迭代器实现,也可以通过operator[]实现的。
注意从内部实现角度,map这理把我们传统说的value值,给的是T类型,typedef为mapped_type。而value_type是红黑树结点中存储的pair键值对值。一样平常使用我们还是风俗将这里的T映射值叫做value。
  1. Member types
  2. key_type     ->  The first template parameter (Key)
  3. mapped_type  ->  The second template parameter (T)
  4. value_type   ->  pair<const key_type,mapped_type>
复制代码
  1. //查找k,返回k所在的迭代器,没有找到返回end(),如果找到了通过iterator可以修改key对应的mapped_type(value)值
  2. iterator find(const key_type& k);
  3. //insert插入一个pair<key, T>对象
  4. //1.如果key已经在map中,插入失败,则返回一个pair<iterator,bool>对象,
  5. //返回pair对象first是key所在结点的迭代器,second是false
  6. //2.如果key不在map中,插入成功,则返回一个pair<iterator,bool>对象,
  7. //返回pair对象first是新插入key所在结点的迭代器,second是true
  8. //也就是说无论插入成功还是失败,返回pair<iterator,bool>对象的first都会指向key所在的迭代器
  9. //那么也就意味着insert插入失败时充当了查找的功能,正是因为这一点,insert可以用来实现operator[]
  10. //需要注意的是这里有两个pair,不要混淆了,
  11. //一个是map底层红黑树节点中存的pair<key, T>,
  12. //另一个是insert返回值pair<iterator, bool>
  13. pair<iterator, bool> insert(const value_type& val);
  14. mapped_type& operator[] (const key_type& k);
  15. //operator的内部实现
  16. mapped_type& operator[] (const key_type& k)
  17. {
  18.         //1.如果key不在map中,insert会插入key和mapped_type(value)的默认值,同时[]返回结点pair<iterator,bool>中存储
  19.         //中的迭代器中存储的mapped_type(value)值的引用,那么我们可以通过引用修改返映射值。所以[]具备了插入 + 修改功能
  20.        
  21.         //2.如果k在map中,insert会插入失败,但是insert返回pair对象的first是指向与key值相同的结点的
  22.         //迭代器,同时[]返回结点中存储mapped_type(value)值的引用,所以[]具备了查找 + 修改的功能
  23.         pair<iterator, bool> ret = insert({ k, mapped_type() });
  24.         iterator it = ret.first;
  25.         return it->second;
  26. }
复制代码
  1. void test_map3()
  2. {
  3.         map<string, string> dict;
  4.         dict.insert({ "sort", "排序" });
  5.         //insert不存在:插入{"insert", string()}
  6.         dict["insert"];
  7.         //left不存在:插入+修改
  8.         dict["left"] = "左边";
  9.         //left存在:修改 将"左边"修改为"左边、剩余"
  10.         dict["left"] = "左边、剩余";
  11.         //left存在:查找,确认left在才能这么用,否则就是插入了
  12.         //输出:左边、剩余
  13.         cout << dict["left"] << endl;
  14.         //right不存在:插入
  15.         //输出:什么都没有
  16.         cout << dict["right"] << endl;
  17. }
复制代码
  1. void test_map4()
  2. {
  3.         //统计水果出现的次数
  4.         string arr[] = { "苹果", "西瓜", "苹果", "西瓜", "苹果", "苹果", "西瓜",
  5.                                          "苹果", "香蕉", "苹果", "香蕉" };
  6.         map<string, int> cntMap;
  7.         //利用find和iterator修改功能,统计水果出现的次数
  8.         for (const auto& str : arr)
  9.         {
  10.                 //先查找水果在不在map中
  11.                 //1、不在,说明水果第一次出现,则插入{水果, 1}
  12.                 //2、在,则查找到的节点中水果对应的次数++
  13.                 auto ret = cntMap.find(str);
  14.                 if (ret == cntMap.end())
  15.                         cntMap.insert({ str, 1 });
  16.                 else
  17.                         ret->second++;
  18.         }
  19.         //利用[]插入+修改功能,巧妙实现统计水果出现的次数
  20.         for (auto& str : arr)
  21.         {
  22.                 //先查找水果在不在map中
  23.                 //1、不在,说明水果第一次出现,则插入{水果, 1}
  24.                 //2、在,则查找到的节点中水果对应的次数++
  25.                 cntMap[str]++;
  26.         }
  27.         for (auto& e : cntMap)
  28.         {
  29.                 //输出苹果:6
  30.             //    西瓜:3
  31.                 //    香蕉 : 2
  32.                 cout << e.first << ":" << e.second << endl;
  33.         }
  34. }
复制代码
multimap和map的区别

multimap和map的使用基本完全类似,紧张区别点在于multimap支持关键值key冗余,而insert/find/count/erase也是key冗余有所差异,这里跟set和multiset完全一样,比如find时,有多个key,返回中序第一个。
其次就是multimap不支持[],因为支持key冗余,[]就只能支持插入了,不能支持修改(因为key有重复,所以不知道修改哪个value)。
  1. int main()
  2. {
  3.         multimap<string, string> dict;
  4.         //插入一定成功
  5.         dict.insert({ "sort", "排序" });
  6.         dict.insert({ "sort", "排序1" });
  7.         dict.insert({ "sort", "排序2" });
  8.         dict.insert({ "sort", "排序3" });
  9.         dict.insert({ "sort", "排序" });
  10.         dict.insert({ "string", "字符串" });
  11.         //将sort全部删除
  12.         dict.erase("sort");
  13.         return 0;
  14. }
复制代码

拜拜,下期再见
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

伤心客

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表