同一对象中的矢量插入

Vector insert within the same object

本文关键字:插入 对象      更新时间:2023-10-16

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

#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()-46 的元素插入向量中。但输出是:

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 .对于vectordequeT也是 Cpp17MoveInsertableX 中, Cpp17MoveConstructibleCpp17MoveAssignable和swappable([swappable.requirements](。ij都不是迭代器 a .

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

因此,行为是未定义的。