C++ | 使用const std::map,map::[]时遇到的一个bug
2024-10-21 06:46:26
原函数简化后如下:
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两个版本,在这样的情况下就发挥了它的意义。今后使用时也应当注意功能相同或相似的函数之间细微的区别。
最新文章
- java.util.NoSuchElementException: Timeout waiting for idle object
- Android 综合揭秘 —— 全面剖释 Service 服务
- Operator overloading
- PDF合并
- emment语法
- 使用Intellij IDEA构建spark开发环境
- 删除所有ecshop版权和logo
- Qt Creator的配置
- mysql 正确的关闭方式
- UOJ Round #1 [数论 | DP 排列]
- 修改input属性placeholder的样式
- Drools(BRMS) 速成教程(上)
- require 和 import 区别
- 使用git push命令如何忽略不想提交的文件夹或者文件
- 12.13 Daily Scrum
- 【Java并发核心七】计划任务ScheduleExecutorService
- 第8月第21天 django lbforum项目记录
- (纪录片)数学的故事 The Story of Maths (2008)
- 标准JAVA MD5方法
- [ACM_数据结构] POJ2352 [树状数组稍微变形]