C++ 标准库中的reverse 函数使用示例

 更新时间:2026年01月12日 09:49:27   作者:白落提fy  
本文介绍了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),原地操作,不需要额外空间

五.注意事项

  1. reverse 函数要求迭代器是双向迭代器(BidirectionalIterator)。
  2. 可以用于所有支持双向迭代器的容器:vectordequeliststring数组
  3. 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++中函数调用运算符重载的实现

    c++中函数调用运算符重载的实现

    在 C++ 中,函数调用运算符的重载是一种特殊的运算符重载方式,允许自定义类的对象像函数一样被调用,本文就来详细的介绍一下c++中函数调用运算符重载的实现,感兴趣的可以了解一下
    2026-02-02
  • C++快速排序及优化方案详解

    C++快速排序及优化方案详解

    这篇文章主要介绍了C++快速排序及优化方案详解,快速排序是一种常用的排序算法,它通过选择一个基准元素,将数组分成两个子数组,其中一个子数组的所有元素都小于基准元素,另一个子数组的所有元素都大于基准元素,需要的朋友可以参考下
    2023-10-10
  • 详解C++异常处理机制示例介绍

    详解C++异常处理机制示例介绍

    任何东西都可以认为是异常,错误只是异常的一种。本文将带大家了解C++中异常是什么,是如何捕获和处理的等相关知识。文中示例代码简洁易懂,感兴趣的小伙伴可以了解一下
    2022-08-08
  • C++实现迷宫小游戏

    C++实现迷宫小游戏

    这篇文章主要为大家详细介绍了C++实现迷宫小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-03-03
  • 5分钟内了解C语言的指针

    5分钟内了解C语言的指针

    这篇文章主要介绍了5分钟内了解C语言的指针,本文讲解了指针、引用和取值、void指针、NULL指针和未初始化指针、指针和数组等内容,需要的朋友可以参考下
    2015-01-01
  • C/C++ 中实现让控制台暂停的方法

    C/C++ 中实现让控制台暂停的方法

    这篇文章主要介绍了C/C++ 中实现让控制台暂停的方法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07
  • C++二叉搜索树图片及代码详解

    C++二叉搜索树图片及代码详解

    在C++编程中二叉堆和二叉搜索树是两种常用的数据结构,它们具有相似之处,但是也有着不同点,这篇文章主要介绍了C++二叉搜索树图片及代码详解的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2025-11-11
  • QT中几种常用的排序函数用法总结

    QT中几种常用的排序函数用法总结

    Qt是目前最先进、最完整的跨平台C++开发工具,下面这篇文章主要给大家介绍了关于QT中几种常用的排序函数用法的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-01-01
  • C++ OpenCV实现图像去水印功能

    C++ OpenCV实现图像去水印功能

    本文将介绍如何使用OpenCV C++ 进行简单图像水印去除。我们在网上download图片时,经常因为版权问题有水印。本案例通过编写算法进行简单水印去除。需要的可以参考一下
    2022-01-01
  • 基于C++内存分配、函数调用与返回值的深入分析

    基于C++内存分配、函数调用与返回值的深入分析

    本篇文章是对C++中的内存分配、函数调用与返回值进行了详细的分析介绍,需要的朋友参考下
    2013-05-05

最新评论