2011-02-14 62 views
0

我有一个定义访问地图数据

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.then当TMP var为const这项事业的错误

但如果我使用一个循环由itrator这项工作正常 为什么第一种方式没有工作 谢谢herzl

+0

你确定地图中包含你所期望的吗?例如,行:`m_table_list [key] [e1.m_short2] = e1.m_short2;`看起来很可疑,关键和值是一样的... – Nim 2011-02-14 15:42:22

+0

我检查地图是否包含其他方式:for(it = tmp.begin (); it!= tmp.end(); it ++){i = it-> first; J = IT->第二; } – 2011-02-14 15:46:12

+0

请显示struct OD,它可能具有short的隐式构造函数,并具有名为m_short1,m_short2,m_Date,m_CT和m_PT的成员。函子通常是轻量级的,不包含从字符串到短地图的映射。 – CashCow 2011-02-14 16:45:52

回答

1

std::map<Key,Value>::operator[](Key const& k)将寻找关键k。如果找不到,它会插入一个新的Value()并返回一个引用。这是一个修改操作。因此,operator[]是非常量。

0

代码没有意义。什么是OD? myPair.second在operator()中很短,但是你做了e1.m_short2,这没有任何意义。

您的可能的错误是,for_each按值取其第三个参数,这意味着它将制作该地图的副本,并且可能会丢失更改。

您可以通过直接指定模板参数或通过在boost :: ref中包装来强制for_each通过引用获取第三个值。然而,你会做得更好,让你的函子把它在构造函数中通过引用构建的地图,而不是一个地图的实例。

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));