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