4

STL マップ "[]" 演算子は、新しいエントリを挿入したり、既存のエントリを変更したりできます。

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

STLマップで実装されたboost::bimapでコードを書き直しています。STL の "[]" 動作を維持する簡単な方法はありますか? 元の STL マップ コード (1 行!) を置き換えるには、7 行以下のコードを記述する必要があることがわかりました。

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

1 に答える 1

4

Boost.Bimap のドキュメントは、テンプレート引数を使用して、およびforを使用してstd::map、そのインクルードを模倣する方法を示しています。operator[]set_oflist_ofbimap

#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";    
}

実例。

UPDATE : 上記のコードでは、左検索も可能です。ただし、必要なoperator[]構文と組み合わせて右検索を行うことはできません。その理由は、修正は変更可能な右ビュー (またはなど)operator[]でのみ行うことができるためです。OTOH、右検索は、不変およびそれらの複数のいとこからのみ実行できます。list_ofvector_of set_ofunordered_set_of

于 2014-07-07T10:09:52.467 に答える