C++ 标准库中的reverse 函数使用示例
一.函数原型
template <class BidirectionalIterator> void reverse(BidirectionalIterator first, BidirectionalIterator last);
二.函数参数
first:指向要反转序列起始位置的迭代器
last:指向要反转序列结束位置的下一个位置的迭代器(左闭右开区间 [first, last))
三.使用示例
1.反转数组
#include <iostream>
#include <algorithm>
int main() {
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
}
return 0;
}2.反转vector
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main() {
vector<int> vec = {1, 2, 3, 4, 5};
reverse(vec.begin(), vec.end());
for (int num : vec) {
cout << num << " "; // 输出: 5 4 3 2 1
}
return 0;
}3.反转string
#include <iostream>
#include <algorithm>
#include <string>
using namespace std;
int main() {
string str = "Hello, World!";
reverse(str.begin(), str.end());
cout << str << endl; // 输出: !dlroW ,olleH
return 0;
}4,反转部分元素
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main() {
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
}
return 0;
}四.复杂度分析
时间复杂度: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 <class BidirectionalIterator, class OutputIterator> OutputIterator reverse_copy(BidirectionalIterator first, BidirectionalIterator last, OutputIterator result);
- 使用示例
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main() {
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
}
return 0;
}2.自定义反转算法实现
#include <iostream>
#include <vector>
using namespace std;
// 手动实现 reverse 功能
template<typename T>
void my_reverse(T begin, T end) {
while (begin != end && begin != --end) {
swap(*begin, *end);
++begin;
}
}
int main() {
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
}
return 0;
}3.与反向迭代器的区别
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
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
}
return 0;
}到此这篇关于C++ 标准库中的reverse 函数的文章就介绍到这了,更多相关C++ 标准库reverse 函数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
C++实现线性表有序表的合并方式(顺序表实现and链表实现)
这篇文章主要介绍了C++实现线性表有序表的合并方式(顺序表实现and链表实现),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教2024-04-04
C语言实现通讯录的八种功能(添加、删除、查找、修改、显示、排序、退出、清空)
本文主要介绍了C语言实现通讯录的八种功能,主要包括添加、删除、查找、修改、显示、排序、退出、清空,感兴趣的可以了解一下2023-09-09


最新评论