ベクトルの複製の作成
ベクトルをそれ自体に追加する場合、パフォーマンス上の理由からループの使用を避けることが望ましいです。 std::vector::insert 関数はオプションですが、*this に反復子を使用することはできません。
std::copy による問題へのアプローチ
この問題を解決するために std::copy を使用することは解決策のように見えるかもしれませんが、このアプローチはセグメント化につながる可能性があります
最適な解決策
最適な解決策には、リサイズ (または予約) と copy_n の両方を使用することが含まれます。その仕組みは次のとおりです。
auto old_count = xx.size(); xx.resize(2 * old_count); std::copy_n(xx.begin(), old_count, xx.begin() + old_count);
このコードは、まず元のベクトル サイズを old_count に格納します。次に、xx のサイズを変更して容量を 2 倍にします。最後に、std::copy_n は要素を xx の先頭から xx の末尾までコピーし、ベクトルを効果的に複製します。
また、resize の代わりにreserveを使用することもできます:
auto old_count = xx.size(); xx.reserve(2 * old_count); std::copy_n(xx.begin(), old_count, std::back_inserter(xx));
reserve を使用する場合、end() イテレータが末尾を超えて指しているため、copy_n は必須であり、
このアプローチは、23.3.6.5 [vector.modifiers] で概説されている条件を満たし、挿入ポイントより前の反復子と参照が有効なままであり、可能であれば再割り当てが発生しないことを保証します。
以上がループを使わずに C でベクトルを効率的に複製するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。