访问地图数据

时间:2011-02-14 15:22:06

标签: c++ stl map

我有一个定义的复杂地图

 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

2 个答案:

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