当前位置: 首页 > news >正文

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

一.函数原型

1

2

template<classBidirectionalIterator>

voidreverse(BidirectionalIterator first, BidirectionalIterator last);

二.函数参数

first:指向要反转序列起始位置的迭代器
last:指向要反转序列结束位置的下一个位置的迭代器(左闭右开区间 [first, last))

三.使用示例

1.反转数组

1

2

3

4

5

6

7

8

9

10

11

#include <iostream>

#include <algorithm>

intmain() {

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.反转vector

1

2

3

4

5

6

7

8

9

10

11

12

#include <iostream>

#include <algorithm>

#include <vector>

usingnamespacestd;

intmain() {

vector<int> vec = {1, 2, 3, 4, 5};

reverse(vec.begin(), vec.end());

for(intnum : vec) {

cout << num <<" ";// 输出: 5 4 3 2 1

}

return0;

}

3.反转string

1

2

3

4

5

6

7

8

9

10

#include <iostream>

#include <algorithm>

#include <string>

usingnamespacestd;

intmain() {

string str ="Hello, World!";

reverse(str.begin(), str.end());

cout << str << endl;// 输出: !dlroW ,olleH

return0;

}

4,反转部分元素

1

2

3

4

5

6

7

8

9

10

11

12

13

#include <iostream>

#include <algorithm>

#include <vector>

usingnamespacestd;

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(intnum : 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的函数原型:

1

2

3

4

template<classBidirectionalIterator,classOutputIterator>

OutputIterator reverse_copy(BidirectionalIterator first,

BidirectionalIterator last,

OutputIterator result);

  • 使用示例

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

#include <iostream>

#include <algorithm>

#include <vector>

usingnamespacestd;

intmain() {

vector<int> src = {1, 2, 3, 4, 5};

vector<int> 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.自定义反转算法实现

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

#include <iostream>

#include <vector>

usingnamespacestd;

// 手动实现 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(intnum : vec) {

cout << num <<" ";// 输出: 5 4 3 2 1

}

return0;

}

3.与反向迭代器的区别

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

#include <iostream>

#include <vector>

#include <algorithm>

usingnamespacestd;

intmain() {

vector<int> 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;

// 重置 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(intnum : vec) {

cout << num <<" ";// 输出: 1 2 3 4 5

}

return0;

}

到此这篇关于C++ 标准库中的reverse 函数的文章就介绍到这了,

http://www.zskr.cn/news/1381147.html

相关文章:

  • 深入AMD处理器底层:SMUDebugTool硬件级调优实战
  • springboot的工程,写业务领域最好提前准备的依赖
  • Diablo Edit2:暗黑破坏神2存档修改器终极指南,轻松打造完美角色
  • 抖音下载效率革命:douyin-downloader批量下载解决方案
  • 网易云音乐还能这样玩?5分钟解锁插件生态,彻底告别单调播放器
  • CVE-2023-27350 sudo权限绕过漏洞深度修复指南
  • 熟食摊创业卖烤鸭必备:靠谱烤鸭成品料厂家电话推荐 - 品牌2025
  • 避开核查高频雷区:ICH Q5A (R2) 标准下,病毒清除缩小模型如何做到全方位合规?
  • 终极HiveWE地图编辑器指南:如何轻松制作专业级魔兽争霸III地图
  • 2026年蚌埠滨湖蓝湾附近中介推荐榜--靠谱(排名前十) - 资讯纵览
  • 搭建自动化内容生成流水线并利用Taotoken统一调度AI模型
  • 【Qwen2.5】采用 RoPE、SwiGLU、RMSNorm、Attention QKV bias 和 tied word embeddings 的 transformers 结构
  • 10分钟掌握暗黑破坏神2存档编辑器:新手完整使用教程
  • 江浙沪名酒回收优质商家推荐:实体门店护航,诚信透明交易 - 资讯纵览
  • OpenCV 4.9.0 尝鲜指南:新DNN模块、Transformer支持与ARM优化,一次讲透
  • 基于WebSocket与ESP32的网页虚拟摇杆实现:低延迟物联网控制方案
  • SingleFile完整指南:如何一键保存完整网页到单个HTML文件
  • 【C++】C++类和对象1:从struct到class,揭开面向对象编程的第一层面纱
  • Taotoken Token Plan 套餐详解与适用场景选择建议
  • 如何选择靠谱的德州英语背单词工具:从用户评价到实际效果全解析
  • 具身智能 | 浅谈具身智能与低空经济融合
  • 高校科研团队如何通过Taotoken管理多个课题组的AI模型使用
  • 宽带隙的半导体
  • 我们为什么做 AR1106:把“声音方向”真正变成设备能力
  • 大模型集体“下海”赚钱:2026年AI生死战已打响,免费时代正式终结?
  • Iwara视频下载神器:2025终极指南,一键批量下载全攻略
  • 3步解决Windows热键冲突的终极技术方案
  • 【Midjourney辉光效果终极指南】:20年AI视觉工程师亲授7种工业级发光参数组合,92%新手3天内复现Dribbble爆款效果
  • 5分钟完成HS2-HF_Patch汉化补丁安装:免费中文翻译终极指南
  • 打卡信奥刷题(3314)用C++实现信奥题 P9183 [USACO23OPEN] FEB B