C++算法(17):reverse函数用法详解,头文件<algorithm>与实战示例
在C++中,std::reverse
函数用于反转容器或数组中元素的顺序,需包含头文件 <algorithm>
。以下是其用法详解:
基本用法
函数原型:
template <class BidirIt>
void reverse(BidirIt first, BidirIt last);
-
参数:两个双向迭代器
first
和last
,表示反转的范围[first, last)
(左闭右开)。 -
作用:将区间内的元素逆序排列。
-
0
示例代码
1. 反转整个容器
#include <algorithm>
#include <vector>
#include <iostream>
using namespace std;int main() {vector<int> v = {1, 2, 3, 4, 5};reverse(v.begin(), v.end()); // 反转整个vector// v变为 {5, 4, 3, 2, 1}// 输出结果for (int num : v) cout << num << " "; // 输出:5 4 3 2 1return 0;
}
2. 反转数组
int arr[] = {1, 2, 3, 4, 5};
reverse(arr, arr + 5); // 反转整个数组
// arr变为 {5, 4, 3, 2, 1}
3. 反转字符串
string s = "hello";
reverse(s.begin(), s.end()); // s变为 "olleh"
4. 反转部分元素
vector<int> v = {1, 2, 3, 4, 5};
reverse(v.begin(), v.begin() + 3); // 反转前3个元素
// v变为 {3, 2, 1, 4, 5}
注意事项
与成员函数对比
std::list
的 reverse
成员函数更高效,建议优先使用:list<int> lst = {1, 2, 3, 4, 5}; lst.reverse(); // 成员函数,时间复杂度 O(n)
-
迭代器有效性:需确保
first
在last
之前,否则行为未定义。 -
C风格字符串:反转时需避免包含末尾的
\0
,例如:char str[] = "hello"; // 实际存储为 {'h','e','l','l','o','\0'} reverse(str, str + 5); // 正确:反转前5个字符,得到 "olleh" // 错误示例:reverse(str, str + 6); // 包含'\0',导致打印异常
-
时间复杂度:O(n),执行 (last - first)/2 次交换。
-
容器支持:需支持双向迭代器(如
vector
,deque
,list
,string
)。单向容器(如forward_list
)需特殊处理。
总结
std::reverse
是一个灵活的工具,适用于大多数支持双向迭代器的容器。使用时需注意迭代器范围和特殊数据结构(如C字符串)的边界条件。