c ++在已知位置插入向量

myx*_*myx 18 c++ stl insert vector

我希望在已知位置插入c ++向量.我知道c ++库有一个insert()函数,它接受一个位置和要插入的对象,但位置类型是一个迭代器.我想插入到矢量中,就像我将使用特定索引插入到数组中一样.

nev*_*219 21

这应该做你想要的.

vector<int>myVec(3);
myVec.insert(myVec.begin() + INTEGER_OFFSET, DATA);
Run Code Online (Sandbox Code Playgroud)

请注意,当重新分配向量时,迭代器可能会失效.请看这个网站.

编辑:我不确定为什么另一个答案消失了...但另一个人提到了以下内容:

myVec.insert(INDEX, DATA);
Run Code Online (Sandbox Code Playgroud)

如果我没记错的话,这应该没问题.


GMa*_*ckG 9

包装这些东西总是很好:

template <typename T>
T& insert_at(T& pContainer, size_t pIndex, const T::value_type& pValue)
{
    pContainer.insert(pContainer.begin() + pIndex, pValue);

    return pContainer;
}
Run Code Online (Sandbox Code Playgroud)

应该这样做.现在已经删除了一个可以从索引构造迭代器的答案,但我以前从未见过.如果这是真的,那肯定是要走的路; 我现在正在寻找它.


Sco*_*hok 5

看看那个调试跟踪.执行的最后一件事是std :: copy(__ first = 0x90c6fa8,__last = 0x90c63bc,__ result = 0x90c6878).回顾一下导致它的原因,你调用insert给出了插入位置为0x90c63bc的位置.std :: copy将范围[first,last]复制到result,其中必须有最后一个元素的空间.这个调用最后是<first,这是非法的(!),所以我猜你给插入的位置是错误的.你确定vnum没有沿线下降吗?在显示该跟踪的GDB中,您应该运行

第10帧

打印vnum

去检查.事实上,如果您在问题中没有缩写,我刚刚发现了您的错误.你的第二行是:

new_mesh->Face(face_loc)->vertices.insert(vertices.begin()+vnum+1, new_vertices[j]);
Run Code Online (Sandbox Code Playgroud)

应该是:

new_mesh->Face(face_loc)->vertices.insert(new_mesg->Face(face_loc)->vertices.begin()+vnum+1, new_vertices[j]);
Run Code Online (Sandbox Code Playgroud)

第一行给出插入点相对于其他一些称为顶点的变量的开头,而不是您要插入的变量.