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两个版本,在这样的情况下就发挥了它的意义。今后使用时也应当注意功能相同或相似的函数之间细微的区别。

posted @ 2019-08-18 21:26  DDKK64  阅读(5020)  评论(0编辑  收藏  举报