STL вставка первого элемента в контейнер std::map
От: Virtus  
Дата: 28.04.11 18:01
Оценка:
Доброго времени суток!
Возник такой вопрос:
Есть контейнер map, в качестве ключа тип int, значения другой map:
std::map< int, std::map< int, CCellInfo*> >
При вставке элемента в контейнер (ключ не существует для "внешнего" map) получается вставить его
только с помощью оператора[], так как не могу создать "вложенный" map, чтобы использовать insert().
Когда же элемент "внешнего" map вставлен (такой ключ уже существует), то можно использовать итератор
"внешнего" и использовать для "вложенного" insert(). Можно ли в такой ситуации не использовать
оператор[]?

 class CCellCell {
   public :
     bool SetSubItemInfo( int nItem, int nSubItem, CCellInfo::eType nType );
     typedef std::map< int, CCellInfo*, std::less< int > > mapSubItem;
     typedef std::pair< int, CCellInfo* >                  pairSubItem;
     typedef mapSubItem::iterator                          itSubItem;
     typedef std::map< int, mapSubItem, std::less< int > > mapItem;
     typedef std::pair< int, mapSubItem >                  pairItem;
     typedef mapItem::iterator                             itItem;
     mapItem                                               m_mapItem;
 };

 bool CCellCell::SetSubItemInfo( int nItem, int nSubItem, CCellInfo::eType nType )
 {
   itItem it = m_mapItem.find( nItem );
   if ( it == m_mapItem.end() ) {

// ключ не существует //
// 1. все работает //
     m_mapItem[nItem][nSubItem] = new CCellInfo(nType);
     return ( true );

// 2. ошибка компиляции - неверный 2-ой аргумент (вместо mapSubItem - pairSubItem)
     return ( (m_mapItem.insert(pairItem(nItem, pairSubItem(nSubItem, new CCellInfo(nType))))).second );

// 3. компилируется, ошибка времени выполнения
     mapSubItem map;
     map.insert( pairSubItem(nSubItem, new CCellInfo(nType)));
     m_mapItem.insert(pairItem(nItem, map));
     return ( true );

    }

// ключ существует //
   itSubItem pos = (it->second).find( nSubItem );

   if ( pos != (it->second).end() ) {
     delete ( pos->second );
     (it->second).erase( pos );
     }

   return ( ((it->second).insert(pairSubItem(nSubItem, new CCellInfo(nType)))).second );
 }
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.