向量插入同一对象

时间:2019-06-17 10:24:23

标签: c++ vector iterator

我试图将一个向量中的几个值插入到相同的向量对象中,但似乎已出错:

#include<iostream>
#include<vector>

using namespace std;

int main()
{
    vector<int> vec;
    for(int i=0;i<9;i++)
    {
        vec.push_back(i+1);
    }

    vec.insert(vec.begin(),vec.begin()+2,vec.end()-4);  //PROBLEM
    vector<int>::iterator ivec=vec.begin();
    while(ivec!=vec.end())
    {
        cout<<*ivec<<' ';
        ++ivec;
    }
    cout<<endl;
    return 0;
}

我希望将vec.begin()+2 3 到元素vec.end()-4 6 的元素插入向量中。但是输出是:

3 1 2 1 2 3 4 5 6 7 8 9

编译器为g++ 4.1.2。我在哪里错了?

2 个答案:

答案 0 :(得分:8)

问题是,当您开始插入元素时,会使该矢量的所有现有迭代器无效,包括指定要尝试插入的范围的迭代器。简单的解决方案是复制要首先插入的向量的切片。

npm install

答案 1 :(得分:4)

vec.insert(vec.begin(),vec.begin()+2,vec.end()-4);

在这里,您将容器的迭代器传递给insert。由于迭代器无效,因此不允许这样做。

[tab:container.req.seq]

 a.insert(p,i,j)
     

期望: T是从X*i Cpp17EmplaceConstructible 。对于vectordequeT也是 Cpp17MoveInsertable X中,    Cpp17MoveConstructible Cpp17MoveAssignable 和可插拔([swappable.requirements])。 ij都不是迭代器   a

     

效果:[i, j)之前的p中插入元素的副本。 [i, j)范围内的每个迭代器都应被完全取消引用一次。

因此,行为是不确定的。