Доброго времени суток!
Возник такой вопрос:
Есть контейнер 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 );
}
Re: STL вставка первого элемента в контейнер std::map
Здравствуйте, Virtus, Вы писали:
V>Доброго времени суток!
я не увидел разницу между вариантом 1 и 3
покажите где у вас возникает "ошибка времени выполнения"
вот вам холст http://ideone.com/GLop4
Re: STL вставка первого элемента в контейнер std::map
Здравствуйте, Virtus, Вы писали:
V>При вставке элемента в контейнер (ключ не существует для "внешнего" map) получается вставить его V>только с помощью оператора[], так как не могу создать "вложенный" map, чтобы использовать insert().
Здравствуйте, uzhas, Вы писали:
U>Здравствуйте, Virtus, Вы писали:
V>>Доброго времени суток! U>я не увидел разницу между вариантом 1 и 3 U>покажите где у вас возникает "ошибка времени выполнения" U>вот вам холст http://ideone.com/GLop4
// 3. компилируется, ошибка времени выполнения
mapSubItem map;
map.insert( pairSubItem(nSubItem, new CCellInfo(nType)));
m_mapItem.insert(pairItem(nItem, map));
return ( true );
Спасибо, посмотрел Ваш пример — вариант работает.
У меня тоже заработал этот вариант. Похоже, возврат из функции закомментирован был.
Re[2]: STL вставка первого элемента в контейнер std::map
Здравствуйте, Virtus, Вы писали:
V>Доброго времени суток! V>Возник такой вопрос: V>Есть контейнер map, в качестве ключа тип int, значения другой map: V>std::map< int, std::map< int, CCellInfo*> > V>При вставке элемента в контейнер (ключ не существует для "внешнего" map) получается вставить его V>только с помощью оператора[], так как не могу создать "вложенный" map, чтобы использовать insert(). V>Когда же элемент "внешнего" map вставлен (такой ключ уже существует), то можно использовать итератор V>"внешнего" и использовать для "вложенного" insert(). Можно ли в такой ситуации не использовать V>оператор[]?
можно:
typedef std::map<int, std::map<int, CCellInfo*> > collection_t;
typedef collection_t::mapped_type subcollection_t;
collection_t _m;
bool insert(int k1, int k2)
{
// используем уже существующуй вложенный мап, если k1 есть во внешнем мапе или создаем пустой вложенный мап
collection_t::iterator it = _m.insert(collection_t::value_type(k1, subcollection_t())).first;
// вставляем элемент во вложенный мап
std::pair<subcollection_t::iterator, bool> result = it->second.insert(subcollection_t::value_type(k2, 0));
// создаем новый объект, если его не было во вложенном мапеif (result.second)
result.first->second = new CCellInfo();
return result.second;
}
Re: STL вставка первого элемента в контейнер std::map