当前位置: 首页 > 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.jsqmd.com/news/884655/

相关文章:

  • 国产大模型新王登基?Qwen3.7-Max全球第五、编程Agent登顶,千问APP免费体验全攻略
  • 如何用douyin-downloader轻松实现抖音内容批量下载与整理
  • AI搜索正在“点名”推荐旅行社,这个GEO案例太猛了 - 品牌背书
  • QTcp网络通信
  • 终极指南:如何用WarcraftHelper让魔兽争霸3在现代电脑上焕发新生 [特殊字符]
  • 模式分层预测驱动推断:处理复杂缺失数据的统计新框架
  • 抖音下载效率革命:douyin-downloader批量下载解决方案
  • 网易云音乐还能这样玩?5分钟解锁插件生态,彻底告别单调播放器
  • 独立开发者如何利用 Taotoken 多模型能力低成本构建 AI 应用原型
  • 自然语言处理的实战项目:从0到1搭建属于自己的文本分类系统
  • 熟食摊创业卖烤鸭必备:靠谱烤鸭成品料厂家电话推荐 - 品牌2025
  • 哪款台灯护眼效果最好孩子用?实测口碑爆款护眼灯品牌,买前必看
  • 华为软挑实战:用双向A*算法搞定200x200网格地图寻路(附C++/Python/Matlab代码)
  • D2DX如何让暗黑破坏神2在4K显示器上流畅运行:5个关键技术解析
  • 连锁不平衡分析终极指南:如何用LDBlockShow快速生成专业级基因组可视化图表
  • 2026年蚌埠滨湖蓝湾附近中介推荐榜--靠谱(排名前十) - 资讯纵览
  • 2001-2025年A股上市公司分行业分地区主营业务构成
  • 浮动布局的自动换行机制
  • ncmdumpGUI终极指南:深度解析网易云音乐NCM加密文件转换技术
  • Fiddler手机断网真相:TLS握手与证书固定的协议级拦截
  • 绩效评估方法
  • 江浙沪名酒回收优质商家推荐:实体门店护航,诚信透明交易 - 资讯纵览
  • 【第四十一周】VLN
  • 2026上海GEO生成式引擎优化服务商综合实力测评:谁在真正帮品牌进入AI答案
  • 基于WebSocket与ESP32的网页虚拟摇杆实现:低延迟物联网控制方案
  • OpenCV 4.9.0 尝鲜指南:新DNN模块、Transformer支持与ARM优化,一次讲透
  • AI算法工程师如何进行数据预处理?这5个步骤让你的数据更优质
  • 基于地理空间数据与机器学习的低成本校园停车预测框架实践
  • 内容创作团队利用 Taotoken 多模型能力优化文案生成流程
  • 3步解决Windows热键冲突的终极技术方案