私は常にemplaceよりもtry_emplaceを好むでしょう。重大な違いは、キーが既に存在する場合、try_emplaceはキーに関連付けられたオブジェクトを作成しないことです。このタイプのオブジェクトが作成するのに費用がかかる場合、パフォーマンスを向上させます。
たとえば、以下のコード(例:https://github.com/PacktPublishing/Cpp17-STL-Cookbook/blob/master/Chapter02/efficient_insert_or_reassign_to_map.cpp上記のコードの場合)
#include <iostream>
#include <functional>
#include <list>
#include <map>
using namespace std;
struct billionaire {
string name;
double dollars;
string country;
};
int main()
{
list<billionaire> billionaires {
{"Bill Gates", 86.0, "USA"},
{"Warren Buffet", 75.6, "USA"},
{"Jeff Bezos", 72.8, "USA"},
{"Amancio Ortega", 71.3, "Spain"},
{"Mark Zuckerberg", 56.0, "USA"},
{"Carlos Slim", 54.5, "Mexico"},
// ...
{"Bernard Arnault", 41.5, "France"},
// ...
{"Liliane Bettencourt", 39.5, "France"},
// ...
{"Wang Jianlin", 31.3, "China"},
{"Li Ka-shing", 31.2, "Hong Kong"}
// ...
};
map<string, pair<const billionaire, size_t>> m;
for (const auto &b : billionaires) {
auto [iterator, success] = m.try_emplace(b.country, b, 1);
if (!success) {
iterator->second.second += 1;
}
}
for (const auto & [key, value] : m) {
const auto &[b, count] = value;
cout << b.country << " : " << count << " billionaires. Richest is "
<< b.name << " with " << b.dollars << " B$\n";
}
}
m.try_emplace(b.country, b, 1);
かのパフォーマンスに追加ペアが構築得ることはありませんが失敗した挿入
'emplace'は挿入が起こっているかどうかをチェックしないので速くなるかもしれませんが、それは本当に良い理由ではありません。 –
がtry_emplaceの利点を追加しています。私はいつもこれをemplaceよりも好きです。 –
@HenriMenke: '' emplace() ''は、 '' value_type''の後に*重複をチェックします。重複が見つかった場合は、割り当てを実行する必要があり(重複の場合には割り当てを解除する必要があるため)、はるかに効率的ではありません。 –