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),原地操作,不需要额外空间

五.注意事项

  1. reverse 函数要求迭代器是双向迭代器(BidirectionalIterator)。
  2. 可以用于所有支持双向迭代器的容器:vectordequeliststring数组
  3. 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;}

Read more

C++短信通知接口示例代码:高性能C++发送通知短信的接口实现及调用逻辑

C++短信通知接口示例代码:高性能C++发送通知短信的接口实现及调用逻辑

在后端开发场景中,短信通知是系统触达用户的核心能力之一,而基于C++开发的高性能服务,对短信接口的调用效率、稳定性要求更高。本文将聚焦c++短信通知接口API示例代码,从底层调用逻辑拆解、实战代码实现、异常处理等维度,手把手教你实现高性能的C++短信通知接口调用,解决开发者在对接短信接口时遇到的参数配置、请求异常、性能优化等核心痛点。 一、C++短信通知接口调用核心原理拆解 1.1 短信接口调用的基本流程 C++调用短信通知接口本质是通过HTTP协议与短信服务商的服务端建立通信,完成参数传递与响应接收,核心流程可分为4步: 1. 构建符合接口规范的HTTP请求(包含请求头、核心参数); 2. 建立网络连接,发送请求到短信接口地址; 3. 接收服务端响应数据并解析; 4. 根据响应结果处理成功/失败逻辑,完成重试或日志记录。 1.2 高性能调用的关键设计要点 C++作为编译型语言,实现高性能短信接口调用需关注两个核心: * 网络请求层面:使用异步非阻塞IO(如libcurl的multi接口)避免主线程阻塞; * 数据处理层面:

By Ne0inhk
【C++:继承】C++面向对象继承全面解析:派生类构造、多继承、菱形虚拟继承与设计模式实践

【C++:继承】C++面向对象继承全面解析:派生类构造、多继承、菱形虚拟继承与设计模式实践

🔥艾莉丝努力练剑:个人主页 ❄专栏传送门:《C语言》、《数据结构与算法》、C/C++干货分享&学习过程记录、Linux操作系统编程详解、笔试/面试常见算法:从基础到进阶 ⭐️为天地立心,为生民立命,为往圣继绝学,为万世开太平 🎬艾莉丝的简介: 🎬艾莉丝的C++专栏简介: 目录 C++的两个参考文档 4  ~>  派生类的默认成员函数专题 4.4  实现一个不可继承类实现 4.4.1  间接实现:【C++98】构造函数私有的类不能被继承 4.4.2  直接实现:final关键字修改基类 4.4.3  代码实现 4.4.4  final关键字

By Ne0inhk

C/C++ static关键字详解(最全解析,static是什么,static如何使用,static的常考面试题)

C/C++ static 关键字最全详解(2026版) 小白到高手、笔试到面试一次讲透! 一、一句话核心总结 static 是“让变量/函数的生命周期或可见范围改变”的关键字,它有三种完全不同的含义,取决于用在什么位置**: 1. 改变存储期(让局部变量变成“全局寿命”) 2. 改变链接性(让全局变量/函数“只在本文件可见”) 3. 属于类而非对象(类静态成员) 记不住全部也没关系,记住这三句话就够日常和面试用了: * 局部 static = “函数内永生变量” * 全局 static = “本文件私有变量/函数” * 类 static = “全类共享成员” 二、static 的三种核心用法对比表(背这个表就够了) 用法位置C语言支持C++支持含义生命周期可见范围默认初始化值局部静态变量YesYes存储期变为静态(函数结束后不销毁)整个程序本函数0全局静态变量YesYes链接性变为内部链接整个程序本文件0全局静态函数YesYes链接性变为内部链接(不可被其他文件调用)整个程序本文件-类静态成员变量NoYes属于类,

By Ne0inhk