独自のコンテンツでベクターを拡張する効率的な方法
C では、ベクター コンテナーは動的メモリ管理に広く使用されています。ループを使用せずにベクトルの内容をそれ自体に追加する場合、開発者は効率的なソリューションを探すことがよくあります。
1 つのアプローチには、std::copy 関数の使用が含まれます。ただし、質問で述べたように、これはセグメンテーション違反につながる可能性があります。その理由は、既存のベクトルの末尾に要素を単純にコピーすると、元の要素が占有するメモリと重複してしまうためです。
より信頼性の高い解決策は、std::resize の組み合わせを使用します。およびstd::copy_n。次のコード スニペットは、このアプローチを示しています。
auto old_count = xx.size(); xx.resize(2 * old_count); std::copy_n(xx.begin(), old_count, xx.begin() + old_count);
このアプローチは、最初に std::resize を使用してベクトルの容量を増やすことで機能します。 std::resize は必要に応じてメモリを再割り当てするため、old_count 変数を使用して元のサイズを覚えておく必要があります。後続の std::copy_n 操作は、元の要素を新しく割り当てられたメモリにコピーし、ベクターの内容を効果的に複製します。
std::resize の代替手段は std::reserve。指定された数の要素を保持するのに十分なメモリのみを割り当てます。ただし、std::reserve を使用した後も、std::copy_n が必要です。これは、終了反復子がベクトルの末尾の 1 つ先の要素を指しているため、挿入が無効になるためです。
std::insert と std::push_back の両方で再割り当てが必要になる可能性があり、挿入ポイントより前の既存のイテレータと参照が無効になる可能性があることに注意することが重要です。したがって、ループを使用せずにベクトルを自身に追加するには、std::resize または std::reserve と std::copy_n 信頼性が高く効率的なソリューションを提供します。
以上がC で独自のコンテンツを含むベクターを効率的に拡張するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。