c++遍历map_C++ map 注意事项

作者: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指针是否合法。

如下:仅供参考

if(map.count(key)>0)   //count(key)  0:not in map, 1:in
{
    return map[key];
}

itor = map.find(key);
if(itor!=map.end())
{
    return itor->second;
}

下标方法很直观,但是效率差很多。因为需要执行两次查找,因此,无论从安全性还是效率考虑,都推荐使用后一种方法。

3、map元素的删除

auto itor_next = map.erase(itor);   

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

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

list遍历删除,仅供参考

for (itor = list->begin(); itor != list->end();  )
{
    if(itor == delete)
    {
                //返回下一个元素itor,需要赋值以便后续遍历
        itor =list->erase(itor);

              //list->erase(it); itor++      //错误,当前itor已经删除,itor++会crash
              //list->erase(it++);            //正确,
    }
        else
        {
        it++;
    }      
}

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

答案是可以的, 如:std::map<:string>

自定义的也是可以的,但是:必须要重载运算符

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

//看看map的定义

template , class Alloc = alloc>

各个参数:第一个key,第二个value,,第三个Compare是比较函数(小于),第四个是内存配置对象

map内部存储机制实际是以红黑树为基础,红黑树在插入节点时,必须依照大小比对之后在一个合适的位置上执行插入动作。

所以作为关键字,起码必须有“

基础类型 int,float等等都有内置的比较函数,与map搭配无论是插入还是查找,都没什么问题。

但是作为class或者struct,如果没有明确定义“

因此:

map的key需要满足以下两点:

1、“

2、如果没有“


●编号522,输入编号直达本文

●输入m获取文章目录

C语言与C++编程

8536e7e2b961b34feff4755f209fb635.png

分享C/C++技术文章

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值