STL地图" []"运营商可以插入新条目或修改现有条目。
map<string, string> myMap;
myMap["key1"] = "value1";
myMap["key1"] = "value2";
我正在使用由STL map实现的boost :: bimap重写一些代码。是否有一种简单的方法来保持STL&#34; []&#34;行为?我发现我必须写下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()这样的实用函数。
答案 0 :(得分:4)
Boost.Bimap documentation通过std::map
和operator[]
set_of
模板参数显示如何模仿list_of
包括bimap
的{{1}}:
#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
)来完成。 OTOH,右搜索只能通过不可变 set_of
和unordered_set_of
以及他们的多兄弟来完成。