Nam*_*nha 1 c++ stl const vector
在处理一个难以在整体上解释/解释的问题时遇到,所以这里是问题的相关重构.
在windows上用gnu g ++编译这段代码
int recreate(const map <int , vector<string> > &bitFieldMap){
cout<<bitFieldMap[1].size();
}
int main(){}
Run Code Online (Sandbox Code Playgroud)
给出以下神秘错误
在函数'int recreate(const std :: map >> &&)'中:D:\ playground\testit.cpp:12:21:错误:将'const std :: map >>>传递为'std'的'st'参数:: map <_Key,_Tp,_Compare,_ Alloc> :: mapped_type&std :: map <_Key,_Tp,_Compare,_Alloc> :: operator [](std :: map <_Key,_Tp,_Compare,_Alloc> :: key_type && )[with _Key = int; _Tp = std :: vector>; _Compare = std :: less; _Alloc = std :: allocator >>>; std :: map <_Key,_Tp,_Compare,_Alloc> :: mapped_type = std :: vector>; std :: map <_Key,_Tp,_Compare,_Alloc> :: key_type = int]'丢弃限定符[-fpermissive] cout <
而从重新创建函数中删除const后,它运行良好,即
int recreate( map <int , vector< string > > &bitFieldMap){
cout<< bitFieldMap[1].size() ;
}
int main(){}
Run Code Online (Sandbox Code Playgroud)
在我的理解中,当值保持不变时,我们使用const来指示编译器进行一些优化.现在,对象上使用的size()函数在每次执行时都会改变某些值,或者某些内存被分配给调用size()时映射容器.
现在我的问题可以通过不在这里使用const或使用multimap来解决.但为什么const和size显示出这种行为?
你没有打电话size()给map.您正在调用operator[]的map,这是一种非const手术,因为它会在该位置创建一个元素,如果一个已经不存在.
然后,您尝试调用size()的vector<string>那个位置,但它是由这一点为时已晚.顺便提一下,size() 是 const标准库容器.