ホームページ >バックエンド開発 >C++ >ベクトルを効率的に複製してそれ自体に追加するにはどうすればよいですか?

ベクトルを効率的に複製してそれ自体に追加するにはどうすればよいですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-12-07 01:53:13755ブラウズ

How to Efficiently Duplicate and Append a Vector to Itself?

効率的なベクトルの自己追加

ベクトルの内容を複製してそれ自体に追加する必要に遭遇したことがありますか?その場合、明示的なループに頼らずに洗練されたソリューションを探している可能性があります。

std::vector::insert が適切な候補のように見えるかもしれませんが、*this を指定して使用すると、反復バージョンは未定義の動作を示します。イテレータ。さらに、std::copy だけではセグメンテーション違反が発生する可能性があります。

心配する必要はありません。次の 2 つのステップを含むシンプルで効率的なアプローチがあります。

  1. サイズ変更: 重複した要素を収容できるようにベクトルの容量を拡張します。この目的のために、サイズ変更または予約のいずれかを使用できます。
  2. Copy: std::copy_n を使用して、元の要素をベクターの新しく割り当てられた部分に転送します。

これはサイズ変更を使用した例です:

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。