ベクトルをそれ自体に追加するためのエレガントなソリューション
ベクトルの内容を複製して元のベクトルに追加するのは一般的な操作です。ただし、ループを使用せずにこれを効率的に実装するのは難しい場合があります。
チャレンジ ディスカッション
この質問は、std::vector::insert と std::copy の制限を強調しています。この特定のタスクのために。 std::vector::insert は現在のベクトルを参照するための反復子の使用を禁止し、std::copy はこのコンテキストで使用されるとセグメンテーション違反をトリガーします。
最適な解決策
最適な解決策には、std::vector::resize (または std::vector::reserve) と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::vector::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));
説明
std::vector::resize は、ベクトルを再割り当てします。新しいサイズが古い容量を超えています。 std::copy_n は、ベクトルの先頭から指定された数の要素を新しい場所にコピーします。
std::vector::reserve を使用する場合、end() イテレータがポイントするため、std::copy_n が必要です。ベクトルの末尾を 1 つ越えた要素。これにより、挿入が無効になります。
結論
このソリューションは、ループベースのメソッドに頼ることなく、ベクトルの内容をそれ自体に追加するための簡潔で効率的な方法を提供します。実装。サイズ変更操作と copy_n 操作を利用すると、最小限のコード オーバーヘッドで目的の機能を実現できます。
以上がループを使用せずにベクトルをそれ自体に効率的に追加するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。