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

Barbara Streisand
リリース: 2024-11-08 16:47:01
オリジナル
154 人が閲覧しました

How to Efficiently Duplicate a Vector in C   Without Loops?

ベクトルの複製の作成

ベクトルをそれ自体に追加する場合、パフォーマンス上の理由からループの使用を避けることが望ましいです。 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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート