
項目 42:要素の挿入の代わりに直接配置を検討する
|
309
•
重複が理由でコンテナが新規の値を拒否することがまずない
コンテナが重複を認める場合か、または追加する要素がほぼすべてで一意となる場合である。
この場合、直接配置関数は一般に値がすでにコンテナ内に存在するかを判断するため、コン
テナ内の要素と比較用に新規の値を持つノードを作成する動作が重要となる。追加する値が
コンテナ内に存在していなければ、ノードは期待通り追加されるが、すでにコンテナ内に存
在する場合は、エラーとなりノードを破棄する。このノード作成/破棄のコストが無駄にな
る。直接配置関数の場合は挿入関数の場合よりもこの無駄、ノード作成/破棄の回数が多い。
本項目で先に挙げた例を再度示しますが、これらはいずれも上記の条件を満たしており、同等機
能の push_back よりも高速に動作します。
vs.emplace_back("xyzzy"); // construct new value at end of
// container; don't pass the type in
// container; don't use container
// rejecting duplicates
コンテナ末尾に新規の値をコンストラクトする。
コンテナ要素の型は渡さない。
重複を認めないコンテナは使用しない。
vs.emplace_back(50, 'x'); // ditto 同上
直接配置関数を用いるか否かを判断する際に覚えておくと良い点があと