假设以下基本向量:
std::vector<int> numbers;
numbers.push_back(0);
numbers.push_back(1);
numbers.push_back(2);
numbers.push_back(3);
在0和1之间插入6个新数字的有效方法是什么?
现在这是我的方法,但我觉得它效率不高:
for (int new_number=0;new_number<6;new_number++) {
numbers.emplace(numbers.begin()+1+new_number,new_number);
}
我不喜欢这种方法的原因是数字1-3必须移动6次。有没有办法将这些数字移动一次而不是6次?然后我可以使用这个循环:
for (int new_number=0;new_number<6;new_number++) {
numbers[new_number+1]=new_number;
}
这是我想要完成的事情:
转移前的矢量:
0 1 2 3
转移后的矢量:
0 X X X X X X 1 2 3
答案 0 :(得分:6)
insert
功能超载,可让您插入n
个相同的项目:
// Add six copies of -1 to the vector starting at position 1
numbers.insert(numbers.begin()+1, 6, -1);
你可以使用另一个需要三个迭代器的重载 - 迭代器插入的位置,以及从哪里获取数据的开始/结束迭代器:
// Insert addedNUmbers at position 1
numbers.insert(numbers.begin()+1, addedNUmbers.begin(), addedNUmbers.end());
答案 1 :(得分:2)
如果您必须从不同的来源逐个插入项目,那么您不能使用范围插入,一个选项是在后面插入所有内容,然后使用std::rotate
:
#include <algorithm>
v.reserve(v.size() + 6);
v.push_back(12);
v.push_back(foo());
// ...
std::rotate(v.begin() + 1, v.begin() + 4, v.end());
答案 2 :(得分:0)
这样的内容会在6
的开头插入numbers
:
numbers.insert(numbers.begin(), 6);
如果要在第一个后插入数字6:
numbers.insert(find(numbers.begin(), numbers.end(), 1), 6);
(显然,如果您不确定该号码是否在列表中,您可能需要在插入之前检查一下!)