現在、次のようなコードがたくさんあります。
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));
}
毎回値を上書きするだけでこれを高速化する方法はありますか?
あなたはただ(map
とunordered_map
)
mydict[key]=value;
私はそれがこのように最速かもしれないと思う:
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
の割り当てが高価で、移動セマンティクスの恩恵を受ける場合に適しています。
C++ 17用に更新するには、次を使用できます。
std::unordered_map::insert_or_assign()
http://en.cppreference.com/w/cpp/container/unordered_map/insert_or_assign
通常、関数を定義することで余分な入力を避け、同じ入力を省くことができます。 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
}