std::rotate 是 C++ 标准库中的一个算法函数,它的作用是将一个范围内的元素向左或向右旋转,使某个元素成为新的起始点。它会重新排列指定范围内的元素,但不会改变元素的顺序结构。
函数签名:
template <class ForwardIt>
ForwardIt rotate(ForwardIt first, ForwardIt middle, ForwardIt last);
参数说明:
first: 指向要旋转的范围的起始位置。
middle: 指向新的起始点,即旋转后第一个元素的位置。
last: 指向要旋转的范围的结束位置(不包括)。
返回值:
std::rotate 返回旋转后原始范围中最初位于 middle 位置的元素的新位置。
举个例子:
假设你有一个整数数组 [1, 2, 3, 4, 5],并希望将数组旋转,使得元素 3 成为第一个元素。
#include <iostream>
#include <vector>
#include <algorithm>
int main() {
std::vector<int> vec = {1, 2, 3, 4, 5};
// 旋转, 使得 3 成为第一个元素
std::rotate(vec.begin(), vec.begin() + 2, vec.end());
// 输出结果
for (int v : vec) {
std::cout << v << " ";
}
return 0;
}
运行结果:
3 4 5 1 2
解释:
在调用 std::rotate 之前,数组是 [1, 2, 3, 4, 5]。
std::rotate(vec.begin(), vec.begin() + 2, vec.end()); 将 3 作为新的起始点。vec.begin() + 2 指向 3。
旋转后,数组变成 [3, 4, 5, 1, 2]。
进一步解释:
first 指向 1,middle 指向 3,last 指向 5 后的位置。
旋转会将 [first, middle) (即 [1, 2])这部分移动到 [middle, last) (即 [3, 4, 5])的后面,而 [middle, last) 这部分移到开头。
这种操作在处理需要调整顺序但保留相对顺序的场景中非常有用。
前向迭代器(ForwardIterator)简介
前向迭代器是一种迭代器类型,它支持以下操作:
可以通过解引用来访问元素。
可以向前移动(支持++操作符)。
任何可以用前向迭代器的算法,也可以用更强的随机访问迭代器来工作(如std::vector和std::array的迭代器)。
C++标准库中的容器如std::vector、std::list、std::deque等都提供了前向迭代器,因此你可以直接在这些容器上使用std::rotate。