私はc ++に比較的慣れておらず、いくつかの調査を試みましたが、オンラインで検索しているときに、主にC配列ではなくC配列に出くわしましたstd::array
。std :: array要素をstd :: vectorに追加std::array
し、要素をstd::vector
?に挿入する最も効率的な方法は何ですか?次のようなSTL関数を使用する必要がありますstd::copy
か?現在、C ++ 17、MinGW64を使用しています。
「追加」値は、問題の要素をコピー/複製するか、ソースコンテナの後方に配置する必要がなく、宛先コンテナに移動するかの2つの意味があります。また、構築時の挿入と、既存の構築済みコンテナへの追加を区別することは理にかなっています。可能であれば、常に、所有するはずの要素を使用してコンテナを構築します。
std::array
すでに構築されている要素に要素をコピーして追加しますstd::vector
。
std::vector<T> dest;
std::array<T, N> source;
// ...
dest.insert(dest.end(), source.cbegin(), source.cend());
移動-std::array
すでに構築されている要素に要素を追加しますstd::vector
。
std::vector<T> dest;
std::array<T, N> source;
// ...
dest.insert(dest.end(), std::move_iterator(source.begin()),
std::move_iterator(source.end()));
std::array
要素をstd::vector
at構造にコピーします。
std::array<T, N> source;
// ...
std::vector<T> dest(source.cbegin(), source.cend());
std::array
要素をstd::vector
at構造に移動します:
std::array<T, N> source;
// ...
std::vector<T> dest(std::move_iterator(source.begin()),
std::move_iterator(source.cend()));
真ん中への挿入について話すとき、ここで追加することはあまりありません-唯一の顕著な違いは、宛先の残りの要素std::vector
が移動構築されるため(O(N))、常に効率が低下することです。
要素を追加するために、ヘッダーからstd::move
とが存在することにも注意してください(ここでsとともに使用できます)。ただし、前者はイテレータの抽象化を操作し、宛先のストレージの詳細を知らなくても一度に1つの要素のコピー/移動を処理するため、これらはへの直接呼び出しほど効率的ではありません(これにより複数のバッファサイズが変更される可能性があります) 、後者はメンバー関数であり、バッファのサイズを1回だけ変更します(必要な場合)。std::copy
<algorithm>
std::copy
std::move_iterator
std::vector::insert
std::vector
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加