Указатель на данные, которые хранятся в контейнере карты - PullRequest
1 голос
/ 16 февраля 2011

У меня есть 2 карты, одна из которых содержит данные

например

struct DATA {
  int A1;
  int A2;
};
typedef map<int,DATA> DataList;
DataList myData;

Я также пробовал некоторые из следующих действий: typedef map<int,DATA*??> DataListPointer; table<col_name,DataListPointer>;

(Примечание: CC: я действительно не получаю эту строку:

карта представляет собой таблицу. Список столбцов и указатель на данные, которые существуют на myData.

или что таблица делает в приведенном выше).

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

Ответы [ 2 ]

3 голосов
/ 16 февраля 2011

Вы можете захотеть 2 перегрузки:

DATA * lookup( DataList & theMap, int key )
{
   DataList::iterator iter = theMap.find( key );
   if( iter != theMap.end() )
   {
      return &iter->second;
   }
   else
     return NULL;
}

и

const DATA * lookup( const DataList & theMap, int key )
{
   DataList::const_iterator iter = theMap.find( key );
   if( iter != theMap.end() )
   {
      return &iter->second;
   }
   else
     return NULL;
}

Конечно, это означает дублирование кода.Так что может быть хорошим кандидатом на конст-каст.

DATA * lookup( DataList & theMap, int key )
{
   return const_cast<DATA *>(lookup( const_cast<const DataList&>(theMap), key));
}

, и вы можете сделать его универсальным шаблоном:

template< typename Key, typename Value >
const Value * mapValueLookup( const std::map<Key, Value>& theMap, Key key )
{
   typename std::map<Key, Value>::const_iterator iter = theMap.find(key);
   if( iter != theMap.end() )
   {
      return &iter->second;
   }
   else
     return NULL;
}

template< typename Key, typename Value >
Value * mapValueLookup( std::map<Key, Value>& theMap, Key key )
{
   return const_cast<Value*>( mapValueLookup
       ( const_cast<const std::map<Key, Value> &>(theMap),
       key ) );
}
0 голосов
/ 16 февраля 2011

Возвращает указатель на значение DATA на карте, если оно есть.

   DataList::iterator it = myData.find( 42 );
   DATA * pData = NULL;       
   if ( it != myData.end() ) {
          pData = &((*it).second);
   }
...