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