23

ベクトルの内容を複製し、元のベクトルの最後に追加したいv[i]=v[i+n] for i=0,2,...,n-1

ループではなく、良い方法を探しています。見ましstd::vector::insertたが、反復バージョンではイテレータが禁止されています*this(つまり、動作は未定義です)。

次のようにも試しstd::copyました(ただし、セグメンテーション違反が発生しました):

copy( xx.begin(), xx.end(), xx.end());

4

4 に答える 4

34

わお。非常に多くの答えがありますが、適切な部分がすべて揃っているものはありません。resize(またはreserve) との両方が必要でありcopy_n、元のサイズを覚えておく必要があります。

auto old_count = xx.size();
xx.resize(2 * old_count);
std::copy_n(xx.begin(), old_count, xx.begin() + old_count);

また

auto old_count = xx.size();
xx.reserve(2 * old_count);
std::copy_n(xx.begin(), old_count, std::back_inserter(xx));

を使用する場合、イテレータは末尾を 1 つ過ぎた要素を指すためreservecopy_nが必要ですend()。これは、最初の挿入の「挿入ポイントの前」でもなく、無効になることを意味します。


23.3.6.5[vector.modifiers]は、 forinsertおよびpush_back:

備考:新しいサイズが古い容量より大きい場合、再割り当てが発生します。再割り当てが発生しない場合、挿入ポイントの前のすべての反復子と参照は有効なままです。T のコピー コンストラクター、ムーブ コンストラクター、代入演算子、ムーブ代入演算子、または任意の InputIterator 操作以外によって例外がスローされた場合、影響はありません。CopyInsertable ではない T のムーブ コンストラクターによって例外がスローされた場合、影響は規定されていません。

于 2013-07-14T05:16:54.093 に答える
3

私は次のようにします:

#include <algorithm>
#include <vector>
#include <utility>

int main(int argc, char* argv[])
{
    std::vector<int> v1 = { 1, 2, 3, 4, 5 };

    {
        std::vector<int> v2(v1.begin(), v1.end());
        std::copy(v1.begin(), v1.end(), std::back_inserter(v2));
        std::swap(v1, v2);
    }

    return 0;
}

編集:少し効率的なバージョンを追加しました。

#include <algorithm>
#include <vector>
#include <utility>

int main(int argc, char* argv[])
{
    std::vector<int> v1 = { 1, 2, 3, 4, 5 };

    {
        typedef std::move_iterator<decltype(v1)::iterator> VecMoveIter;
        std::vector<int> v2(v1);
        std::copy(VecMoveIter(v1.begin()), VecMoveIter(v1.end()), std::back_inserter(v2));
        v1 = std::move(v2);
    }

    return 0;
}
于 2013-07-14T05:29:17.303 に答える
0

重複の複数のスロットを追加するため。

    int main() {
        std::vector<int> V;
        V.push_back(1);
        V.push_back(2);

        int oldSize = V.size();
        int newSize = oldSize;
        int nDupSlot = 4;

        V.resize(nDupSlot * oldSize);
        for(int i=0; i<(nDupSlot-1); ++i) {
            std::copy_n(V.begin(), oldSize, V.begin() + newSize);       
            newSize = newSize + oldSize;
         }

        for(int i =0; i<V.size(); ++i) {
            std::cout<<V[i];
            }

        return 0;
    }

出力:

12121212
于 2014-07-21T15:53:13.453 に答える
0

最も効果的な方法ではないかもしれませんが、確かに簡単です。

std::vector<int> toAppend(xx);
xx.insert(xx.end(), toAppend.begin(), toAppend.end();
于 2015-11-22T14:01:02.197 に答える