「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > C++ でループを使用せずにベクトルを効率的に複製するにはどうすればよいですか?

C++ でループを使用せずにベクトルを効率的に複製するにはどうすればよいですか?

2024 年 12 月 22 日に公開
ブラウズ:262

How to Efficiently Duplicate a Vector in C   Without Loops?

ベクトルの重複の作成

ベクトルをそれ自体に追加する場合、パフォーマンス上の理由からループの使用を避けることが望ましいです。 std::vector::insert 関数はオプションではありますが、*this.

std::copy の問題へのアプローチ

に反復子を使用することはできません。 ]この問題を解決するには std::copy を使用することが解決策のように見えるかもしれませんが、このアプローチはセグメント化につながる可能性があります。 aults.

最適な解決策

最適な解決策には、サイズ変更 (または予約) と 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 の末尾まで要素をコピーし、ベクトルを効果的に複製します。

または、size:

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 は必須です。 inserts.

このアプローチは、23.3.6.5 [vector.modifiers] で概説されている条件を満たし、次のことを保証します。挿入ポイントより前のイテレータと参照は有効なままであり、可能な場合は再割り当ては発生しません。

最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3