您可以使用 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)
);
我的练习程序中有一个向量,需要对它进行部分反转。例如
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)
);