Увеличить Bimap до insert_or_modify

#c #boost #bimap

#c #увеличить #bimap

Вопрос:

Оператор STL map «[]» может вставлять новые записи или изменять существующие записи.

 map<string, string> myMap;
myMap["key1"] = "value1";
myMap["key1"] = "value2";
  

Я переписываю некоторый код с помощью boost::bimap, который был реализован с помощью STL map. Есть ли простой способ сохранить поведение STL «[]»? Я обнаружил, что мне нужно написать код ниже 7 строк, чтобы заменить исходный код карты STL (1 строка!).

 bimap<string, string>::left_iterator itr = myBimap.left.find("key1");
if (itr != myBimap.left.end()) {
    myBimap.left.replace_data(itr, "value2");
} 
else {
    myBimap.insert(bimap<string, string>::value_type("key1", "value2"));
}
  

Мне было интересно, есть ли служебная функция, подобная boost::bimap::insert_or_modify() .

Ответ №1:

В документации Boost.Bimap показано, как имитировать a, std::map включая его operator[] , используя set_of и list_of для bimap аргументов шаблона:

 #include <iostream>
#include <string>
#include <boost/bimap.hpp>
#include <boost/bimap/set_of.hpp>
#include <boost/bimap/list_of.hpp>

int main()
{
    using namespace std;    
    map<string, string> myMap;
    myMap["key1"] = "value1";
    myMap["key1"] = "value2";
    for (autoamp;amp; elem : myMap)
        std::cout << "{" << elem.first << ", " << elem.second << "}, ";
    std::cout << "n";

    using namespace boost::bimaps;
    bimap<set_of<string>, list_of<string>> myMap2;
    myMap2.left["key1"] = "value1";
    myMap2.left["key1"] = "value2";
    for (autoamp;amp; elem : myMap2.left)
        std::cout << "{" << elem.first << ", " << elem.second << "}, ";
    std::cout << "n";

    auto res1 = myMap2.left.find("key1");
    std::cout << "{" << res1->first << ", " << res1->second << "} n";    
}
  

Живой пример.

ОБНОВЛЕНИЕ: приведенный выше код также допускает поиск по левой стороне. Однако поиск справа невозможен в сочетании с требуемым operator[] синтаксисом. Причина в том, что operator[] изменения могут быть выполнены только с помощью изменяемого вида справа (такого list_of или vector_of ). OTOH, поиск справа может выполняться только из неизменяемых set_of и unordered_set_of и их двоюродных братьев.

Комментарии:

1. Что, если мне также понадобится myMap2.left.find("foo") и myMap2.right.find("bar") ? Похоже, что list_of не предоставляет find() функцию-член. И при объявлении myMap2 как bimap<set_of<string>, set_of<string>> возникла ошибка компиляции из-за использования [] оператора.