我有一个定义的复杂地图
typedef short short1
typedef short short2
typedef map<short1,short2> data_list;
typedef map<string,data_list> table_list;
我有一个填充table_list
的类class GroupingClass
{
table_list m_table_list;
string Buildkey(OD e1){
string ostring;
ostring+=string(e1.m_Date,sizeof(Date));
ostring+=string(e1.m_CT,sizeof(CT));
ostring+=string(e1.m_PT,sizeof(PT));
return ostring;
}
void operator() (const map<short1,short2>::value_type& myPair) {
OD e1=myPair.second;
string key=Buildkey(e1);
m_table_list[key][e1.m_short1]=e1.m_short2;
}
operator table_list() {
return m_table_list;
}
};
我用它
table_list TL2
GroupingClass gc;
TL2=for_each(mapOD.begin(), mapOD.end(), gc);
但是当我尝试访问内部地图时,我遇到了问题 例如
data_list tmp;
tmp=TL2["AAAA"];
short i=tmp[1]; //I dont update i variable
当调试它时,我看到代码尝试向map添加新值。然后当tmp var为const
时导致错误
但如果我通过itrator使用循环,这项工作正常 为什么这首先没有工作 谢谢herzl
答案 0 :(得分:1)
std::map<Key,Value>::operator[](Key const& k)
会查找密钥k
。如果找不到,它将插入一个新的Value()
并返回对它的引用。这是一个修改操作。因此,operator[]
是非常量的。
答案 1 :(得分:0)
代码没有意义。什么是OD? myPair.second在operator()中会很短,但是你会做e1.m_short2这没有任何意义。
您可能的错误是for_each按值获取其第3个参数,这意味着它将复制该地图,并且您可能会丢失更改。
您可以通过直接指定模板参数或通过包装boost :: ref来强制for_each通过引用获取第3个值。但是,你可以做得更好,让你的仿函数在构造函数中通过引用构建它所构建的地图,而不是拥有一个地图实例。
class GroupingClass
{
table_list & m_table_list;
string Buildkey(OD e1)
{
string ostring;
ostring+=string(e1.m_Date,sizeof(Date));
ostring+=string(e1.m_CT,sizeof(CT));
ostring+=string(e1.m_PT,sizeof(PT));
return ostring;
}
public:
explicit GroupingClass( table_list & the_table_list ) :
m_table_list( the_table_list )
{
}
void operator() (const map<short1,short2>::value_type& myPair) const
{
OD e1(myPair.first); // probably what you meant
string key=Buildkey(e1);
m_table_list[key][e1.m_short1]=e1.m_short2;
// did you mean m_table_list[key][myPair.first] = myPair.second; ?
}
};
并通过
使用它table_list TL2;
for_each(mapOD.begin(), mapOD.end(), GroupingClass(TL2));