C++ map 注意事项

论坛 期权论坛 期权     
C语言与C++编程   2019-6-29 20:29   3220   0
作者:Leehm
链接:https://www.cnblogs.com/leehm/p/10682560.html
1、往map里面插入元素:

下标方式[]:    map[key] = value;                                
调用insert:       map.insert(make_pair(key, value));   
下标方式是通过重载[]操作符来实现的,它直接进行插入或覆盖,

而insert方法会判断是否存在相同的key,如果存在则直接返回,放弃插入操作。如果不存在才进行插入。

2、从map里面获取元素

下标方式:       if()value = map[key];
迭代器方式:  value =  itor->second;

需要检查key是否存在,如果不存在,map[key]返回就是未知,而不是null,因为这时会在map中插入一个key的元素,value取默认值,返回value,所以未知,是很危险的操作,建议使用迭代器的方式,会习惯性的去判断itor指针是否合法。

如下:仅供参考
  1. if(map.count(key)>0)   //count(key)  0:not in map, 1:in
  2. {
  3.     return map[key];
  4. }
  5. itor = map.find(key);
  6. if(itor!=map.end())
  7. {
  8.     return itor->second;
  9. }
复制代码
下标方法很直观,但是效率差很多。因为需要执行两次查找,因此,无论从安全性还是效率考虑,都推荐使用后一种方法。

3、map元素的删除

auto itor_next = map.erase(itor);   

//C++11 中返回的是移除元素后的下一个迭代器, 这个参数必须是容器中的有效迭代器,不能是结束迭代器。如果迭代器参数指向的是容器的最后一个元素,那么会返回结束迭代器

// list的earse也是返回下一个

list遍历删除,仅供参考
  1. for (itor = list->begin(); itor != list->end();  )
  2. {
  3.     if(itor == delete)
  4.     {
  5.                 //返回下一个元素itor,需要赋值以便后续遍历
  6.         itor =list->erase(itor);
  7.               //list->erase(it); itor++      //错误,当前itor已经删除,itor++会crash
  8.               //list->erase(it++);            //正确,
  9.     }
  10.         else
  11.         {
  12.         it++;
  13.     }
  14. }
复制代码

4、map的key是否可以为类class或者struct,自定义呢,需要注意哪些

答案是可以的, 如:std::map

自定义的也是可以的,但是:必须要重载运算符
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:200
帖子:40
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP