原函数简化后如下:

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

最新文章

  1. java.util.NoSuchElementException: Timeout waiting for idle object
  2. Android 综合揭秘 —— 全面剖释 Service 服务
  3. Operator overloading
  4. PDF合并
  5. emment语法
  6. 使用Intellij IDEA构建spark开发环境
  7. 删除所有ecshop版权和logo
  8. Qt Creator的配置
  9. mysql 正确的关闭方式
  10. UOJ Round #1 [数论 | DP 排列]
  11. 修改input属性placeholder的样式
  12. Drools(BRMS) 速成教程(上)
  13. require 和 import 区别
  14. 使用git push命令如何忽略不想提交的文件夹或者文件
  15. 12.13 Daily Scrum
  16. 【Java并发核心七】计划任务ScheduleExecutorService
  17. 第8月第21天 django lbforum项目记录
  18. (纪录片)数学的故事 The Story of Maths (2008)
  19. 标准JAVA MD5方法
  20. [ACM_数据结构] POJ2352 [树状数组稍微变形]

热门文章

  1. E4A写的app,点按钮,直接进入抖音指定用户界面
  2. 作业——11 分布式并行计算MapReduce
  3. 【深入学习linux】系统分区与格式化
  4. fxjwind Calcite分析 - Volcano模型
  5. 360极速浏览器安装vue-devtools插件
  6. pytorch保证每次运行使用的随机数都相同的方法
  7. 查看 redis 请求日志
  8. Pycharm连接远程服务器并进行代码上传+远程调试
  9. 图像处理软件ImageJ
  10. TWA那些事儿