#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>>
возникла ошибка компиляции из-за использования[]
оператора.