Вставка в std ::Multimap из std ::Map (C )

#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:

Это двухэтапный процесс:

  1. Найдите позицию на внешней карте, где вы хотите что-то сделать с внутренней картой. При необходимости вставьте новый элемент.
  2. Обновите внутреннюю карту соответствующим значением.

Я не знаю, почему внешняя карта использует 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;
  

(набран на мобильном устройстве: вероятно, есть опечатки, но общий подход должен работать).