Доброго времени суток!
Возник такой вопрос:
Есть контейнер 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 );
}