我希望能够在向量中间(或其他位置)插入元素,而不会覆盖现有元素。
说我的矢量有3 6 9 10,我想在6之后插入7.如何在不引起问题的情况下完成?这是非常罕见的操作,因此效率在这里不是问题。此外,此时,我无法切换到另一个容器(例如:std :: list),这些容器适用于中间的插入。
向量中的std::insert
会做我想要的吗?怎么样?
感谢
答案 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::find
和vector::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 ++编码标准中所说的那样。)