我希望在已知位置插入c ++向量。我知道c ++库有一个insert()函数,它接受一个位置和要插入的对象,但位置类型是一个迭代器。我想插入到矢量中,就像我将使用特定索引插入数组一样。
答案 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的其他变量的开头的插入点,而不是你要插入的变量。