ベクトルの内容を複製してそれ自体に追加する必要に遭遇したことがありますか?その場合、明示的なループに頼らずに洗練されたソリューションを探している可能性があります。
std::vector::insert が適切な候補のように見えるかもしれませんが、*this を指定して使用すると、反復バージョンは未定義の動作を示します。イテレータ。さらに、std::copy だけではセグメンテーション違反が発生する可能性があります。
心配する必要はありません。次の 2 つのステップを含むシンプルで効率的なアプローチがあります。
これはサイズ変更を使用した例です:
auto old_count = xx.size(); xx.resize(2 * old_count); std::copy_n(xx.begin(), old_count, xx.begin() + old_count);
あるいは、reserve を次のように利用することもできます。 std::back_inserter:
auto old_count = xx.size(); xx.reserve(2 * old_count); std::copy_n(xx.begin(), old_count, std::back_inserter(xx));
reserve を使用する場合、end() がベクトルの末尾の 1 つ先を指しているため、挿入ポイントとして無効になるため、std::copy_n が必須であることに注意してください。
上記のソリューションにより、結果として得られるベクトルには、複製されて追加された元の要素が確実に含まれ、既存の要素の整合性が維持され、再割り当てが最小限に抑えられます。操作。
以上がベクトルを効率的に複製してそれ自体に追加するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。