同一对象中的矢量插入
Vector insert within the same object
我试图将几个值从向量插入到同一个向量对象,但它似乎出错了:
#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
。我错在哪里?
问题是,当您开始插入元素时,您将该向量的任何现有迭代器失效,包括指定您尝试插入范围的迭代器。简单的解决方案是先复制要插入的矢量切片。
vector<int> tmp(vec.begin() + 2, vec.end() - 4);
vec.insert(vec.begin(), tmp.begin(), tmp.end());
vec.insert(vec.begin(),vec.begin()+2,vec.end()-4);
在这里,您将迭代器insert
传递到容器本身。由于迭代器失效,这是不允许的。
Per [tab:container.req.seq]:
a.insert(p,i,j)
期望:T 是 Cpp17EmplaceConstructible to
X
from*i
.对于vector
和deque
,T
也是 Cpp17MoveInsertable 到X
中, Cpp17MoveConstructible、Cpp17MoveAssignable和swappable([swappable.requirements](。i
和j
都不是迭代器a
.效果:在
p
之前插入[i, j)
元素的副本。[i, j)
范围内的每个迭代器应只取消引用一次。
因此,行为是未定义的。
相关文章:
- 将包含不可复制对象的对插入到映射中
- 在 std::map 中插入对象时构造函数中变量的地址
- 在 c++ 列表中插入对象
- 在列表C 中插入对象
- 如何创建插入对象使用duktape
- 如何在地图中插入对象以保持其排序
- bad_alloc通过右值和对象有效性插入对象时
- 插入对象以设置c++
- 在地图中插入对象而不复制对象
- C++:使用递归在二叉搜索树中插入对象
- 如何在矢量中高效、正确地插入对象
- vector插入对象的副本或引用
- 我可以插入对象到tr1 unordered_map
- 在ostreams中插入对象
- 如何在指针数组中插入对象
- 在链表中按升序插入对象
- 标记分派结构不能插入对象类型
- 链表-插入对象
- 在vector的下标处插入对象
- 按字母顺序向vector插入对象