web-dev-qa-db-ja.com

ifを使用せずにstd :: unordered_map要素を挿入/更新する最も速い方法は何ですか?

現在、次のようなコードがたくさんあります。

std::unordered_map<int,int> my_dict;
.
.
.
// If the key does exist in the dictionary
if(my_dict.count(key) == 1){
    my_dict[key] = value;
}

// If its a new key
else{
    my_dict.insert(std::make_pair(key,value));
}

毎回値を上書きするだけでこれを高速化する方法はありますか?

35
user997112

あなたはただ(mapunordered_map

mydict[key]=value;
49
Joe

私はそれがこのように最速かもしれないと思う:

auto it = my_dict.find(key);
if( it != my_dict.end() ) {
    *it = value;
}
else {
    my_dict.insert(std::make_pair(key,value));
}

そうすれば、keyが既に存在し、ルックアップが1つしかない場合は、unordered_mapの構造を変更しません。


後でvalueを必要としない/アクセスしない場合の別のオプション:

my_dict[key] = std::move(value);

これは、valueの割り当てが高価で、移動セマンティクスの恩恵を受ける場合に適しています。

18
Daniel Frey

C++ 17用に更新するには、次を使用できます。

std::unordered_map::insert_or_assign()

http://en.cppreference.com/w/cpp/container/unordered_map/insert_or_assign

4
htmlboss

通常、関数を定義することで余分な入力を避け、同じ入力を省くことができます。 C++ 17のinsert_or_assign()にアクセスできない場合、次のようなものを自分で実装できます。

bool InsertOrAssign(std::unordered_map& m, int key, int value) {
  // Your code or one of the suggested answers goes here
}
1
Serge Rogatch