Повысить Bimap до insert_or_modify

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 ().

4

Решение

Boost.Bimap документация показывает, как имитировать 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 (auto&& 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 (auto&& 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). ОТО, правый поиск может быть сделан только из неизменный set_of а также unordered_set_of и их мульти кузены.

4

Другие решения


По вопросам рекламы [email protected]