在处理一个难以在整体上解释/解释的问题时遇到,所以这里是问题的相关重构。
使用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显示出这种行为?
答案 0 :(得分:6)
您没有在map
上致电map
。 const
上的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[]
。
返回对映射到等效于键的键的值的引用,如果此类键尚不存在则执行插入。