C++ 同一对象内的向量插入

C++ 同一对象内的向量插入,c++,vector,iterator,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()

我试图从一个向量向同一个向量对象插入几个值,但似乎出现了错误:

#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;
}
编译器是
g++4.1.2
。我错在哪里

vec.insert(vec.begin(),vec.begin()+2,vec.end()-4);
这里,您将迭代器传递到容器本身的
insert
。这是不允许的,因为迭代器无效

Per:

预期:T可从
*i
定位到
X
。对于
vector
deque
T
也可插入
X
, CPP17可移动可构造、CPP17可移动可分配和可交换([swappable.requirements])无论是
i
还是
j
都不是
a

效果:在
p
之前插入
[i,j)
中元素的副本。范围
[i,j)
中的每个迭代器应精确地取消引用一次


因此,行为是未定义的。

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

 vector<int> tmp(vec.begin() + 2, vec.end() - 4);
 vec.insert(vec.begin(), tmp.begin(), tmp.end());
向量tmp(向量begin()+2,向量end()-4); insert(vec.begin(),tmp.begin(),tmp.end());
如果存在分配,至少所有迭代器都是无效的。同样相关的:我相信,这是U.B.,因为:
std::vector::insert()< /代码>可能导致重新分配。反过来,可能会使所有当前迭代器无效。如果我是正确的,插入一个具有自身值的向量是一个坏主意。我鼓励您考虑<代码>插入/ <代码>以使这项工作。这个问题是正在进行的关于元的讨论的主题:
 a.insert(p,i,j)
 vector<int> tmp(vec.begin() + 2, vec.end() - 4);
 vec.insert(vec.begin(), tmp.begin(), tmp.end());