欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-04-29 19:07:36
对const map使用std::map::[]产生的bug研究了一会儿,发现了const, non-const的各自独特的用处。 ......

原函数简化后如下:

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的成员函数:本身不是const成员函数(操作符),对于不在map中的关键字,使用下标操作符会创建新的条目,改变了map。

解决办法可用如下:

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

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