为什么 const 不适用于 stl map 的 size(),而它非常适合其他容器

Why does const does not works with size() for stl map, whereas it works perfectly for other containers ?

本文关键字:非常 其他 适用于 不适用 const stl map size 为什么      更新时间:2023-10-16

在处理一个难以描述/解释的问题时遇到,所以这里是问题的相关重现。

在 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[]

返回对映射到等效键的值的引用,如果此类键尚不存在,则执行插入

相关文章: