STL 映射“[]”运算符可以插入新条目或修改现有条目。

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

我正在使用由 STL 映射实现的 boost::bimap 重写一些代码。有没有一种简单的方法来保持 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 documentation 显示了如何通过使用 std::mapoperator[] 作为 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";
}

Live Example.

UPDATE :上面的代码也允许左搜索。但是,无法与所需的 operator[] 语法结合使用右搜索。原因是 operator[] 修改只能通过 可变 右 View (例如 list_ofvector_of )来完成。 OTOH,只能从 不可变 set_ofunordered_set_of 以及它们的多个表亲进行右搜索。

关于c++ - 将 Bimap boost 到 insert_or_modify,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24604293/

10-11 01:27