为什么 const 不适用于 stl map 的 size(),而它非常适合其他容器
Why does const does not works with size() for stl map, whereas it works perfectly for other containers ?
在处理一个难以描述/解释的问题时遇到,所以这里是问题的相关重现。
在 Windows 上使用 GNU G++ 编译此代码
int recreate(const map <int , vector<string> > &bitFieldMap){
cout<<bitFieldMap[1].size();
}
int main(){}
给出以下神秘错误
在函数 'int recreate(const std::map>>&)' 中: D:\playground\testit.cpp:12:21:错误:将"const std::map>>"作为"this"参数传递 'std::map<_Key, _Tp, _Compare, _Alloc>::mapped_type& std::map<_Key, _Tp, _Compare, _Alloc>::运算符[](std::map<_Key, _Tp, _Compare, _Alloc>::key_type&&) [_Key = int; _Tp = std::vector>; _Compare = std::less; _Alloc = 标准::分配器>>>;std::map<_Key, _Tp, _Compare, _Alloc>::mapped_type = 标准::矢量>;std::map<_Key, _Tp, _Compare, _Alloc>::key_type = int]' 丢弃限定符 [-fpermissive] cout<</blockquote>
而从重新创建功能中删除常量后,它运行良好,即
int recreate( map <int , vector< string > > &bitFieldMap){ cout<< bitFieldMap[1].size() ; } int main(){}
在我的理解中,当值保持不变时,我们使用 const,指示编译器进行一些优化。现在,要么对象上使用的 size() 函数每次执行时都会更改一些值,要么在调用 size() 时分配给映射容器的一些内存正在发生一些令人毛骨悚然的事情。
现在我的问题可以通过在这里不使用 const 或使用多映射来解决。但是为什么常量和大小显示这种行为?
您没有在map
上调用size()
。您正在map
上调用operator[]
,这是一个非const
操作,因为如果不存在元素,它将在该位置创建一个元素。
然后,您尝试在该位置的vector<string>
上呼叫size()
,但此时为时已晚。顺便说一下,size()
const
在标准库容器上。
常量的不是size
,而是operator[]
。
返回对映射到等效键的值的引用,如果此类键尚不存在,则执行插入。
- 在执行其他功能的同时播放动画(LED矩阵和Arduino/ESP8266)
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- GL_SHADERSTORAGE_BUFFER位置是否与其他着色器位置冲突
- 为什么我不能在 C++ 中的特定函数重载中调用同一函数的任何其他重载?
- 在其他文件中创建类时在 c++ 项目中不起作用
- 类与私有变量的其他类之间的线程安全性
- OpenGL大的3D纹理(>2GB)非常慢
- 将--whole archive链接器选项与CMake和具有其他库依赖项的库一起使用
- 为什么需要复制构造函数,在哪些情况下它们非常有用
- GlobalAlloc而不是其他分配方法
- C++从其他 constexpr 创建 lambda 不能按顺序执行 Constexpr
- 断言中的Fold表达式在某些计算机上编译,但在其他计算机上不编译
- Visual Studio(或任何其他工具)能否将地址解释为调用堆栈(boost上下文)的开头
- 结构和双指针隐藏在其他结构中,多层混淆
- 为什么std::互斥需要很长的、非常不规则的时间来共享
- UE4在OnComponentBeginOverlap上铸造其他actor
- 当我在其中一个线程执行中(在activemq-cpp中)捕获到特定值时,我如何终止/停止所有其他线程
- 在打开多个其他窗口时使用全屏窗口时帧速率非常低
- 为什么 const 不适用于 stl map 的 size(),而它非常适合其他容器