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));

使用reserve, 时copy_n是必需的,因为end()迭代器将一个元素指向末尾...这意味着它也不是第一次插入的“插入点之前”,并且变得无效。


23.3.6.5[vector.modifiers]承诺 forinsertpush_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 回答