Доступ к картографическим данным - PullRequest
0 голосов
/ 14 февраля 2011

У меня сложная карта, которая определила

 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, это приводит к ошибке

но если я использую цикл с помощью итератора, эта работа будет выполнена правильно почему это не работает с первого взгляда спасибо Герцль

Ответы [ 2 ]

1 голос
/ 14 февраля 2011

std::map<Key,Value>::operator[](Key const& k) будет искать ключ k.Если он не найден, он вставит новый Value() и вернет ссылку на него.Это модифицирующая операция.Следовательно, operator[] не является постоянным.

0 голосов
/ 14 февраля 2011

Код не имеет смысла. Что такое ОД? myPair.second будет коротким в operator (), но тогда вы делаете e1.m_short2, что не имеет никакого смысла.

Ваша вероятная ошибка в том, что for_each принимает свой третий параметр по значению, что означает, что он собирается делать копии этой карты, и, вероятно, вы потеряете изменения.

Вы можете заставить for_each принимать 3-е значение по ссылке, либо указав параметр шаблона напрямую, либо добавив значение boost :: ref. Однако вам лучше бы заставить ваш функтор взять карту, которую он строит, по ссылке в своем конструкторе, а не иметь экземпляр карты.

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