在std :: vector中间插入元素的最无痛方法是什么

时间:2009-11-03 15:23:38

标签: c++ stl

我希望能够在向量中间(或其他位置)插入元素,而不会覆盖现有元素。

说我的矢量有3 6 9 10,我想在6之后插入7.如何在不引起问题的情况下完成?这是非常罕见的操作,因此效率在这里不是问题。此外,此时,我无法切换到另一个容器(例如:std :: list),这些容器适用于中间的插入。

向量中的std::insert会做我想要的吗?怎么样?

感谢

6 个答案:

答案 0 :(得分:11)

此操作有vector::insert

iterator insert(
   iterator _Where,
   const Type& _Val
);
void insert(
   iterator _Where,
   size_type _Count,
   const Type& _Val
);

答案 1 :(得分:7)

我编辑了这个例子,在'6'之后直接插入'7',因为问题更多是关于在特定位置插入而不是在矢量中心任意插入。

std::vector<int> v;
v.push_back(3);
v.push_back(6);
v.push_back(9);
v.push_back(10);
std::vector<int>::iterator insert_pos = std::find(v.begin(), v.end(), 6);
// only increment iterator if we've found the insertion point,
// otherwise insert at the end of the vector
if (insert_pos != v.end()) {
    ++insert_pos;
}
v.insert(insert_pos, 7);
// v now contains 3, 6, 7, 9, 10

答案 2 :(得分:2)

根据上述评论,同时使用vector::findvector::insert,会提供以下代码:

std::vector<int> v;
v.push_back(3);
v.push_back(6);
v.push_back(9);
v.push_back(10);
std::vector<int>::iterator pos = std::find(v.begin(),v.end(), 6);
v.insert(pos, 7);

答案 3 :(得分:2)

如果您的矢量是有序的,您可以通过避免线性搜索来稍微优化插入:

std::vector<int> v;
v.push_back(3);
v.push_back(6);
v.push_back(9);
v.push_back(10);

std::insert(std::upper_bound(v.begin(), v.end(), 7), 7);

答案 4 :(得分:1)

您可能想要使用向量的插入成员函数。

答案 5 :(得分:1)

Mash的示例代码是关键点(但要小心它会插入您想要的奇数大小的位置)。此外,即使您说效率不是问题,您可以考虑使用vector的reserve()成员函数来避免重新分配和隐藏复制。 (“不要过早地悲观”,正如Sutter和Alexandrescu在 C ++编码标准中所说的那样。)