在C ++中移动向量的值

时间:2013-10-02 20:49:25

标签: c++ stdvector

假设以下基本向量:

 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

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);

(显然,如果您不确定该号码是否在列表中,您可能需要在插入之前检查一下!)