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

时间:2010-02-24 23:46:08

标签: c++ stl vector insert

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

3 个答案:

答案 0 :(得分:21)

这应该做你想要的。

vector<int>myVec(3);
myVec.insert(myVec.begin() + INTEGER_OFFSET, DATA);

请注意,当重新分配vector时,迭代器可能会失效。请参阅此site

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

myVec.insert(INDEX, DATA);

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

答案 1 :(得分: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;
}

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

答案 2 :(得分:5)

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

  

第10帧

     

print vnum

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

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

应该是:

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

第一行给出了相对于一些名为vertices的其他变量的开头的插入点,而不是你要插入的变量。