1

假设以下基本向量:

 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
4

3 回答 3

7

该函数有一个重载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());
于 2013-10-02T20:55:30.737 回答
3

如果您必须从不同的来源一个接一个地插入项目,因此您不能使用范围插入,一种选择是在后面插入所有内容,然后使用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());
于 2013-10-02T21:08:47.780 回答
0

像这样的东西会6在开头插入numbers

numbers.insert(numbers.begin(), 6);

如果要在数字 1 之后插入数字 6:

numbers.insert(find(numbers.begin(), numbers.end(), 1), 6);

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

于 2013-10-02T20:55:22.300 回答