2011-02-14 67 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));