#c #map #stl #insert
#c #словарь #stl #вставить
Вопрос:
Если у меня есть std::multimap<int, std::map<int, MyClass>> myMultimap
, как вставить объект класса MyClassA
в карту со значением 1
в значении multimap 2
?
Похоже, я могу это сделать myMultimap.at(2).insert(std::pair<1,MyClassA>);
на c 11, но я использую c 98 из-за регрессии / несопоставимости библиотеки вне моего контроля.
Я также пробовал
myMultimap[2].insert(
std::make_pair(
myMultimap[2].end(),
myClassA
)
);
что дает: error: no match for ‘operator[]’ (operand types are ‘std::multimap<int, std::map<int, ns_namespace::MyClassType> >’ and ‘int’)|
для обоих [
.. ]
..
Я не хочу делать что-то подобное myMultimap.insert(std::make_pair(2,std::make_pair(1,MyClassA)))
, потому что, если я правильно понимаю, это создаст новую карту в multimap, а не назначит объект класса существующей карте в multimap.
Комментарии:
1.
multimap
иat
/[]
не имеет смысла. Подумайте об этом. Действительно подумайте об этом.2. с помощью multimap у вас может быть несколько записей со значением ключа 2. в какой из них есть карта, в которую вы хотите вставить свой объект? вот в чем вопрос — решайте!
3. Я думаю, это имеет смысл. Есть ли способ сделать что-то похожее на .at(), но с использованием итератора? (кроме того, я только что понял, что C 11 добавил .at в map, а не multimap, упс)
4. например, .find(3) возвращает итератор, а затем использует его для доступа к карте?
5. Карта карт, скорее всего, уже в неправильном направлении! Tes, вы можете использовать подобные структуры данных, но они вряд ли будут особенно полезны. Я бы предположил, что карта, индексируемая парой целых чисел, подходит гораздо лучше.
Ответ №1:
Это двухэтапный процесс:
- Найдите позицию на внешней карте, где вы хотите что-то сделать с внутренней картой. При необходимости вставьте новый элемент.
- Обновите внутреннюю карту соответствующим значением.
Я не знаю, почему внешняя карта использует multimap (они редко полезны), поэтому в примере используется только первая запись:
auto it = mymultimap.lower_bound(2);
if (it == mymultimap.end() || it->first != 2) {
it = mymultimap.insert(
std::make_pair(2, std::map<int, MyClass>())).first;
}
(*it)[1] = MyClassA;
(набран на мобильном устройстве: вероятно, есть опечатки, но общий подход должен работать).