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

时间:2016-01-18 16:38:36

标签: c++ vector stl const

在处理一个难以在整体上解释/解释的问题时遇到,所以这里是问题的相关重构。

使用gnu g ++在Windows上编译此代码

int recreate(const map <int , vector<string> > &bitFieldMap){
    cout<<bitFieldMap[1].size();
}
int main(){}

给出以下神秘错误

  

在函数'int recreate(const std :: map&gt;&gt;&amp;)'中:   D:\ playground \ testit.cpp:12:21:错误:传递'const std :: map&gt; &GT;”作为'这个'的论点   'std :: map&lt; _Key,_Tp,_Compare,_ Alloc&gt; :: mapped_type&amp;的std ::地图&LT; _key,   _Tp,_Compare,_ Alloc&gt; :: operator [](std :: map&lt; _Key,_Tp,_Compare,_Alloc&gt; :: key_type&amp;&amp;)[with _Key = int; _Tp = std :: vector&gt ;; _Compare = std :: less;   _Alloc = std :: allocator&gt; &GT;取代; std :: map&lt; _Key,_Tp,   _Compare,_Alloc&gt; :: mapped_type = std :: vector&gt ;; std :: map&lt; _Key,_Tp,_Compare,_Alloc&gt; :: key_type = int]'丢弃限定符[-fpermissive] cout&lt;

然后从重新创建函数中删除const后,它运行良好,即

int recreate( map <int , vector< string > > &bitFieldMap){
    cout<< bitFieldMap[1].size() ;
}
int main(){}

根据我的理解,当值保持不变时,我们使用 const ,指示编译器进行一些优化。现在,对象上使用的size()函数在每次执行时都会改变某些值或者在调用size()时,有一些内存被分配给映射容器的内存令人毛骨悚然。

现在我的问题可以通过在这里不使用const或使用multimap来解决。但为什么const和size显示出这种行为?

2 个答案:

答案 0 :(得分:6)

您没有在map上致电mapconst上的calling operator[]size() is const,这是非size()操作,因为如果一个元素尚不存在,它将在该位置创建一个元素。

然后,您尝试在该位置的vector<string>处致电{{1}},但到目前为止为时已晚。顺便提一下,标准库容器上的{{3}}。

答案 1 :(得分:4)

size实际上不是非Document doc = new Document(); DocumentBuilder builder = new DocumentBuilder(doc); builder.Font.Name = "Calibri"; builder.CellFormat.LeftPadding = 0; builder.CellFormat.RightPadding = 0; builder.CellFormat.TopPadding = 0; builder.CellFormat.BottomPadding = 0; Table table = builder.StartTable(); // Insert a cell builder.InsertCell(); builder.CellFormat.PreferredWidth = PreferredWidth.FromPercent(33); //Insert inner table Table table1 = builder.StartTable(); builder.InsertCell(); table1.Alignment = TableAlignment.Left; table1.PreferredWidth = PreferredWidth.FromPercent(50); builder.Write("This is cell 1"); builder.EndRow(); builder.EndTable(); // Insert a cell builder.InsertCell(); //Insert inner table Table table2 = builder.StartTable(); builder.InsertCell(); table2.Alignment = TableAlignment.Center; table2.PreferredWidth = PreferredWidth.FromPercent(50); builder.ParagraphFormat.Alignment = ParagraphAlignment.Center; builder.Write("This is cell 2"); builder.EndRow(); builder.EndTable(); // Insert a cell builder.InsertCell(); builder.CellFormat.PreferredWidth = PreferredWidth.FromPercent(33); //Insert inner table Table table3 = builder.StartTable(); builder.InsertCell(); table3.PreferredWidth = PreferredWidth.FromPercent(50); table3.Alignment = TableAlignment.Right; builder.ParagraphFormat.Alignment = ParagraphAlignment.Right; builder.Write("This is cell 3"); builder.EndRow(); builder.EndTable(); builder.EndRow(); builder.EndTable(); doc.Save(MyDir + "Out.docx"); ,而是operator[]

  

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