
一.函数原型12templateclassBidirectionalIteratorvoidreverse(BidirectionalIterator first, BidirectionalIterator last);二.函数参数first指向要反转序列起始位置的迭代器last指向要反转序列结束位置的下一个位置的迭代器左闭右开区间 [first, last)三.使用示例1.反转数组1234567891011#include iostream#include algorithmintmain() {intarr[] {1, 2, 3, 4, 5};intn sizeof(arr) /sizeof(arr[0]);std::reverse(arr, arr n);for(inti 0; i n; i) {std::cout arr[i] ;// 输出: 5 4 3 2 1}return0;}2.反转vector123456789101112#include iostream#include algorithm#include vectorusingnamespacestd;intmain() {vectorint vec {1, 2, 3, 4, 5};reverse(vec.begin(), vec.end());for(intnum : vec) {cout num ;// 输出: 5 4 3 2 1}return0;}3.反转string12345678910#include iostream#include algorithm#include stringusingnamespacestd;intmain() {string str Hello, World!;reverse(str.begin(), str.end());cout str endl;// 输出: !dlroW ,olleHreturn0;}4,反转部分元素12345678910111213#include iostream#include algorithm#include vectorusingnamespacestd;intmain() {vectorint 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(intnum : 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_copyreverse函数不保证稳定性因为交换元素可能会改变相等元素的相对顺序但通常我们使用reverse时并不关心这个因为元素值不同且即使相同反转后顺序也变了。C标准库还提供了reverse_copy函数它可以将反转的结果复制到另一个序列中而不改变原序列。reverse_copy的函数原型1234templateclassBidirectionalIterator,classOutputIteratorOutputIterator reverse_copy(BidirectionalIterator first,BidirectionalIterator last,OutputIterator result);使用示例123456789101112131415161718#include iostream#include algorithm#include vectorusingnamespacestd;intmain() {vectorint src {1, 2, 3, 4, 5};vectorint dst(src.size());reverse_copy(src.begin(), src.end(), dst.begin());cout 原序列: ;for(intnum : src) {cout num ;// 输出: 1 2 3 4 5}cout \n反转后的副本: ;for(intnum : dst) {cout num ;// 输出: 5 4 3 2 1}return0;}2.自定义反转算法实现12345678910111213141516171819#include iostream#include vectorusingnamespacestd;// 手动实现 reverse 功能templatetypenameTvoidmy_reverse(T begin, T end) {while(begin ! end begin ! --end) {swap(*begin, *end);begin;}}intmain() {vectorint vec {1, 2, 3, 4, 5};my_reverse(vec.begin(), vec.end());for(intnum : vec) {cout num ;// 输出: 5 4 3 2 1}return0;}3.与反向迭代器的区别123456789101112131415161718192021222324252627#include iostream#include vector#include algorithmusingnamespacestd;intmain() {vectorint vec {1, 2, 3, 4, 5};// 使用 reverse 函数修改原容器reverse(vec.begin(), vec.end());cout 使用 reverse 后: ;for(intnum : vec) {cout num ;// 输出: 5 4 3 2 1}cout endl;// 重置 vectorvec {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(intnum : vec) {cout num ;// 输出: 1 2 3 4 5}return0;}到此这篇关于C 标准库中的reverse 函数的文章就介绍到这了,