您可以使用 std::reverse 或任何其他内置方法部分反转向量吗?

Can you reverse an vector partly using std::reverse or any other in-built method?

我的练习程序中有一个向量,需要对它进行部分反转。例如

vector<int> nums;
for(int i = 0; i < 10; i++) {nums.push_back(i)}
#than I would want to reverse it somewhat like this
std::reverse(nums.location(3), nums.location(5))

这应该让 nums 看起来像这样:0 1 4 3 2 5 6 7 8 9。 显然 nums.location() 不是真正的方法。

您可以通过使用 iterators 来完成此操作。迭代器可以想象成一个对象,专门在它来自的容器中移动。

std::vector::begin returns 指向向量第一个元素的迭代器,因此将表现为指向向量第一个元素的指针。要访问它,您 取消引用迭代器:

auto value_at_first_element = *(v.begin());

要移动到下一个元素,您增加迭代器:

auto iter_to_second_element = ++(v.begin());
auto value_at_second_element = *iter_to_second_element;

值得注意的是,并非所有迭代器的行为方式都相同,可以分为 类别 。大多数都有自己的功能,受容器的限制。最典型的例子是 std::forward_list,它的迭代器只能通过调用 ++ 运算符向前移动。


研究以下问题的解决方案,并尝试建立一些关于迭代器的直觉。迭代器非常强大,是 C++ 算法的基石。

// If you know the positions already...
std::reverse(nums.begin() + 2, nums.begin() + 5);
// If you need to _find_ the positions...
std::reverse(
    std::find(nums.begin(), nums.end(), 2)
  , std::find(nums.begin(), nums.end(), 5)
    );

Further reading