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 ().
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
и их мульти кузены.