C++ 标准库中的 reverse 函数
C++ 标准库中的 reverse 函数
在C++标准库中,reverse函数用于反转序列。它定义在< algorithm >头文件中。以下是详细说明:
一.函数原型
template<classBidirectionalIterator>voidreverse(BidirectionalIterator first, BidirectionalIterator last);二.函数参数
first:指向要反转序列起始位置的迭代器
last:指向要反转序列结束位置的下一个位置的迭代器(左闭右开区间 [first, last))
三.使用示例
1.反转数组
#include<iostream>#include<algorithm>intmain(){int arr[]={1,2,3,4,5};int n =sizeof(arr)/sizeof(arr[0]); std::reverse(arr, arr + n);for(int i =0; i < n; i++){ std::cout << arr[i]<<" ";// 输出: 5 4 3 2 1}return0;}2.反转vector
#include<iostream>#include<algorithm>#include<vector>usingnamespace std;intmain(){ vector<int> vec ={1,2,3,4,5};reverse(vec.begin(), vec.end());for(int num : vec){ cout << num <<" ";// 输出: 5 4 3 2 1}return0;}3.反转string
#include<iostream>#include<algorithm>#include<string>usingnamespace std;intmain(){ string str ="Hello, World!";reverse(str.begin(), str.end()); cout << str << endl;// 输出: !dlroW ,olleHreturn0;}4,反转部分元素
#include<iostream>#include<algorithm>#include<vector>usingnamespace std;intmain(){ vector<int> vec ={1,2,3,4,5,6,7,8};// 只反转中间部分元素 [2, 3, 4, 5, 6] -> [6, 5, 4, 3, 2]reverse(vec.begin()+1, vec.end()-1);for(int num : vec){ cout << num <<" ";// 输出: 1 7 6 5 4 3 2 8}return0;}四.复杂度分析
时间复杂度:O(n),其中 n 是 last - first,执行大约 n/2 次交换
空间复杂度:O(1),原地操作,不需要额外空间
五.注意事项
- reverse 函数要求迭代器是双向迭代器(BidirectionalIterator)。
- 可以用于所有支持双向迭代器的容器:vector、deque、list、string、数组等
- reverse 会修改原容器,如果不希望修改原容器,可以使用 reverse_copy
六.相关函数
1.reverse_copy
reverse函数不保证稳定性(因为交换元素可能会改变相等元素的相对顺序,但通常我们使用reverse时并不关心这个,因为元素值不同,且即使相同,反转后顺序也变了)。
C++标准库还提供了reverse_copy函数,它可以将反转的结果复制到另一个序列中,而不改变原序列。
- reverse_copy的函数原型:
template<classBidirectionalIterator,classOutputIterator> OutputIterator reverse_copy(BidirectionalIterator first, BidirectionalIterator last, OutputIterator result);- 使用示例
#include<iostream>#include<algorithm>#include<vector>usingnamespace std;intmain(){ vector<int> src ={1,2,3,4,5}; vector<int>dst(src.size());reverse_copy(src.begin(), src.end(), dst.begin()); cout <<"原序列: ";for(int num : src){ cout << num <<" ";// 输出: 1 2 3 4 5} cout <<"\n反转后的副本: ";for(int num : dst){ cout << num <<" ";// 输出: 5 4 3 2 1}return0;}2.自定义反转算法实现
#include<iostream>#include<vector>usingnamespace std;// 手动实现 reverse 功能template<typenameT>voidmy_reverse(T begin, T end){while(begin != end && begin !=--end){swap(*begin,*end);++begin;}}intmain(){ vector<int> vec ={1,2,3,4,5};my_reverse(vec.begin(), vec.end());for(int num : vec){ cout << num <<" ";// 输出: 5 4 3 2 1}return0;}3.与反向迭代器的区别
#include<iostream>#include<vector>#include<algorithm>usingnamespace std;intmain(){ vector<int> vec ={1,2,3,4,5};// 使用 reverse 函数修改原容器reverse(vec.begin(), vec.end()); cout <<"使用 reverse 后: ";for(int num : vec){ cout << num <<" ";// 输出: 5 4 3 2 1} cout << endl;// 重置 vector vec ={1,2,3,4,5};// 使用反向迭代器(不修改原容器,只是反向遍历) cout <<"使用反向迭代器遍历: ";for(auto it = vec.rbegin(); it != vec.rend();++it){ cout <<*it <<" ";// 输出: 5 4 3 2 1} cout << endl; cout <<"原容器未被修改: ";for(int num : vec){ cout << num <<" ";// 输出: 1 2 3 4 5}return0;}