C++ | 使用const std::map,map::[]时遇到的一个…

2019-08-26 05:37:19来源:博客园 阅读 ()

新老客户大回馈,云服务器低至5折

C++ | 使用const std::map,map::[]时遇到的一个bug

原函数简化后如下:

void fun(const map<int,vector<int>> &mp, int index) {
    for (auto tmp : mp[index]) {
        //......
    }
}

结果报错如下:

[Error] passing 'const std::map<int, std::vector<int> >' as 'this' argument of 'std::map<_Key, _Tp, _Compare, _Alloc>::mapped_type& std::map<_Key, _Tp, _Compare, _Alloc>::operator[](const key_type&) [with _Key = int; _Tp = std::vector<int>; _Compare = std::less<int>; _Alloc = std::allocator<std::pair<const int, std::vector<int> > >; std::map<_Key, _Tp, _Compare, _Alloc>::mapped_type = std::vector<int>; std::map<_Key, _Tp, _Compare, _Alloc>::key_type = int]' discards qualifiers [-fpermissive]

经过长时间的查询大概问题就是出在,对于const的对象使用了非const的成员函数:std::map::[]本身不是const成员函数(操作符),对于不在map中的关键字,使用下标操作符会创建新的条目,改变了map。

解决办法可用如下:

  • 去掉const,这样有一定的安全风险
  • 拷贝map,有一定的性能开销
  • 对于C++11,可以使用map::at。它有const和non-const两个版本,对于找不到匹配关键字的情况,会抛出out_of_range。由于下标检查,也带来了性能代价。

结论:许多成员函数都设置了const和non-const两个版本,在这样的情况下就发挥了它的意义。今后使用时也应当注意功能相同或相似的函数之间细微的区别。


原文链接:https://www.cnblogs.com/wyzersblog/p/11374046.html
如有疑问请与原作者联系

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:ESP32 - GPIO中断触发与事件回调

下一篇:C++中的C