1

を持っています unordered_map<string, list<SomeClass>::iterator>

このマップに要素を挿入したいのですが、まだ存在しない場合に限ります。存在する場合、既存のアイテムを上書きしたくありません。また、アイテムが存在するかどうかを確認してから挿入するための 2 つのルックアップを回避したいと考えています。operator[] を使用してキーを持つ要素を取得し、有効かどうかを確認し、有効でない場合は初期化する必要があるという結論に達しました。問題は、要素が反復子であり、初期化されているかどうかを確認する必要があることですが、これは実際には不可能です。リスト反復子クラスから派生したクラスを使用し、デフォルト コンストラクターを実装してそれを「無効な」値に初期化できますが、コンストラクターでは、リスト インスタンスにアクセスして end() 反復子を取得することはできません。それを行う方法はありますか?

4

1 に答える 1

3

insertまたはを使用emplaceします。値が既に存在する場合、値は上書きされません。

auto i = m.insert(std::make_pair("hello"), my_iterator);
auto j = m.emplace("hello", my_iterator);                  // same

i.second挿入が成功したかどうかをテストしi.firstて、マップ要素へのイテレータです。

于 2012-12-05T10:02:43.373 に答える