news 2026/7/7 8:04:56

一天认识一个STL库函数——reverse()

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
一天认识一个STL库函数——reverse()

一、什么是reverse()函数?

reverse()是C++ STL中一个非常有用的算法函数,用于反转序列容器(如vector、list、deque、string等)中元素的顺序。它属于<algorithm>头文件中的算法库,可以高效地将容器中的元素顺序完全颠倒。

二、基本用法

1.反转整个容器

#include <iostream> #include <algorithm> // reverse()函数在这里 #include <vector> using namespace std; int main() { vector<int> numbers = {1, 2, 3, 4, 5}; for (int num : numbers) { cout << num << " "; } cout << std::endl; // 输出: 1 2 3 4 5 // 使用reverse()反转整个vector reverse(numbers.begin(), numbers.end()); for (int num : numbers) { cout << num << " "; } cout << std::endl; // 输出: 5 4 3 2 1 return 0; }

2.反转字符串

#include <iostream> #include <algorithm> #include <string> using namespace std; int main() { string text = "Hello, World!"; // 反转字符串 reverse(text.begin(), text.end()); cout << "反转后: " << text << std::endl; // 输出: !dlroW ,olleH // 判断回文字符串 string palindrome = "racecar"; string original = palindrome; reverse(palindrome.begin(), palindrome.end()); if (original == palindrome) { cout << original << " 是回文字符串!" << endl; } else { cout << original << " 不是回文字符串!" << endl; } return 0; }

3.反转部分元素

#include <iostream> #include <algorithm> #include <vector> using namespace std; int main() { vector<int> numbers = {10, 20, 30, 40, 50, 60, 70}; for (int num : numbers) { cout << num << " "; } cout << endl; // 输出: 10 20 30 40 50 60 70 // 只反转中间部分(第2到第5个元素,索引1到4) reverse(numbers.begin() + 1, numbers.begin() + 5); for (int num : numbers) { cout << num << " "; } cout << endl; // 输出: 10 50 40 30 20 60 70 return 0; }

三、reverse()函数的特点

1.参数:两个迭代器

// 函数签名 template<class BidirIt> void reverse(BidirIt first, BidirIt last); // first: 指向要反转的第一个元素 // last: 指向要反转的最后一个元素的下一个位置

2.时间复杂度:O(n)

  • 需要遍历一半的元素进行交换

  • 对于n个元素,大约需要n/2次交换

3.原地操作

  • reverse()直接在原容器上修改,不创建新容器

  • 不需要额外的内存空间(除了临时变量)

4.支持双向迭代器

  • 需要容器的迭代器支持双向移动(++和--)

  • 适用于vector、deque、list、string等

四、实际应用场景

1.旋转数组

#include <iostream> #include <algorithm> #include <vector> using namespace std; void rotateArray(vector<int>& arr, int k) { int n = arr.size(); k = k % n; // 处理k大于数组长度的情况 if (k == 0) return; // 方法:三次反转法 // 1. 反转整个数组 reverse(arr.begin(), arr.end()); // 2. 反转前k个元素 reverse(arr.begin(), arr.begin() + k); // 3. 反转剩余元素 reverse(arr.begin() + k, arr.end()); } int main() { vector<int> numbers = {1, 2, 3, 4, 5, 6, 7}; cout << "原始数组: "; for (int num : numbers) { cout << num << " "; } cout << endl; // 向右旋转3位 rotateArray(numbers, 3); cout << "旋转3位后: "; for (int num : numbers) { cout << num << " "; } cout << std::endl; // 输出: 5 6 7 1 2 3 4 return 0; }

2.反转单词顺序

#include <iostream> #include <algorithm> #include <string> #include <sstream> #include <vector> using namespace std; string reverseWords(string s) { // 先反转整个字符串 reverse(s.begin(), s.end()); stringstream ss(s); string word, result; vector<std::string> words; // 分割单词 while (ss >> word) { // 反转每个单词(恢复原始顺序) reverse(word.begin(), word.end()); words.push_back(word); } // 重新组合 for (size_t i = 0; i < words.size(); ++i) { if (i > 0) result += " "; result += words[i]; } return result; } int main() { string sentence = "the sky is blue"; cout << "原始句子: " << sentence << endl; cout << "单词反转后: " << reverseWords(sentence) << endl; // 输出: blue is sky the return 0; }

3.数字反转

#include <iostream> #include <algorithm> #include <string> using namespace std; int reverseNumber(int num) { // 处理负数 bool isNegative = num < 0; if (isNegative) num = -num; // 转换为字符串 string numStr = to_string(num); // 反转字符串 reverse(numStr.begin(), numStr.end()); // 转换回整数 int result = stoi(numStr); // 恢复负号 return isNegative ? -result : result; } int main() { int num1 = 12345; int num2 = -6789; cout << num1 << " 反转后: " << reverseNumber(num1) << endl; // 54321 cout << num2 << " 反转后: " << reverseNumber(num2) << endl; // -9876 return 0; }

五、与其他反转方法的比较

1.手动反转

#include <iostream> #include <vector> using namespace std; void manualReverse(vector<int>& vec) { int left = 0; int right = vec.size() - 1; while (left < right) { // 交换元素 swap(vec[left], vec[right]); left++; right--; } } int main() { vector<int> numbers = {1, 2, 3, 4, 5}; cout << "手动反转前: "; for (int num : numbers) { cout << num << " "; } cout << endl; manualReverse(numbers); cout << "手动反转后: "; for (int num : numbers) { cout << num << " "; } cout << endl; return 0; }

2.使用rbegin()和rend()

#include <iostream> #include <vector> using namespace std; int main() { vector<int> numbers = {1, 2, 3, 4, 5}; cout << "反向遍历(不修改原数组): "; for (auto it = numbers.rbegin(); it != numbers.rend(); ++it) { cout << *it << " "; } cout << endl; // 输出: 5 4 3 2 1 cout << "原数组未改变: "; for (int num : numbers) { cout << num << " "; } cout << endl; // 输出: 1 2 3 4 5 return 0; }

六、C++20及后续版本

在C++20中,引入了范围库,可以使用更简洁的语法:

#include <iostream> #include <vector> #include <algorithm> #include <ranges> // C++20 using namespace std; int main() { vector<int> numbers = {1, 2, 3, 4, 5}; // C++20范围视图(不修改原容器) auto reversedView = numbers | std::views::reverse; cout << "使用C++20范围视图反向遍历: "; for (int num : reversedView) { cout << num << " "; } cout << endl; // 输出: 5 4 3 2 1 cout << "原数组未改变: "; for (int num : numbers) { cout << num << " "; } cout << endl; // 输出: 1 2 3 4 5 return 0; }

七、总结&今日题目

reverse()是STL中一个简单但强大的算法函数,用于反转容器中元素的顺序。记住以下要点:

  1. 包含头文件#include <algorithm>

  2. 参数:两个迭代器,表示要反转的范围

  3. 时间复杂度:O(n),进行大约n/2次交换

  4. 原地操作:直接修改原容器

  5. 适用容器:支持双向迭代器的容器(vector、deque、list、string、array等)

  6. 常见用途

    • 反转字符串或数组

    • 判断回文

    • 旋转数组

    • 反转单词顺序

  7. 注意事项

    • 确保迭代器范围有效

    • list有自己的reverse()成员函数,效率更高

    • 使用reverse_copy()如果需要保留原容器

今日题目:回文检查器

问题描述

你正在开发一个文本处理工具,需要检查用户输入的单词或句子是否是回文(palindrome)。回文是指正读和反读都一样的字符串(忽略大小写、空格和标点符号)。

功能要求:

  1. 提示用户输入一个单词或句子

  2. 清理输入(移除空格、标点,转换为小写)

  3. 使用reverse()函数辅助判断是否为回文

  4. 显示判断结果

输入格式

一个字符串(可能包含空格和标点符号)。

输出格式

判断结果和详细的分析过程。

解答:

#include <iostream> #include <algorithm> #include <string> #include <cctype> uisng namesapce std; int main() { string input; getline(cin, input); string cleaned; for (char ch : input) { if (isalnum(ch)) { cleaned += tolower(ch); } } // 使用reverse()判断 string reversed = cleaned; reverse(reversed.begin(), reversed.end()); // 输出结果 cout << "结果: "; if (cleaned == reversed) { cout << "是回文" << endl; } else { cout << "不是回文" << endl; } return 0; }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/7 11:45:18

32、网络启动服务器设置与U-Boot引导程序使用指南

网络启动服务器设置与U-Boot引导程序使用指南 1. 动态主机配置协议(DHCP)服务器设置 在进行网络启动服务器设置时,首先要关注DHCP服务器的相关配置。 - 文件名(filename) :目标设备需要加载的镜像文件名,根据RFC 2131规定,文件名长度限制为128字节。 - 根路径选…

作者头像 李华
网站建设 2026/7/7 6:21:16

计算机专业就业方向有哪些,可以从事什么行业,零基础入门到精通,收藏这篇就够了!

软件开发工程师是计算机专业中的核心职业&#xff0c;主要负责设计、编写、测试和维护软件系统。随着人工智能、云计算、大数据等技术的快速发展&#xff0c;这一岗位的需求持续增长。软件工程师不仅需要具备扎实的编程基础&#xff0c;还应对各种编程语言有深入的了解。 01 计…

作者头像 李华
网站建设 2026/7/7 7:54:07

Kubernetes Service 完全指南:从基础到生产实践

引言:为什么需要 Service? 在 Kubernetes 的世界里,Pod 是短暂且动态的。它们会被创建、销毁、重启、扩展,每次这些操作都会导致 Pod IP 地址的变化。想象一下,如果你的应用程序需要连接一个数据库,而这个数据库的 IP 地址每分钟都在变化,那将是多么糟糕的体验! 这就…

作者头像 李华
网站建设 2026/7/7 14:11:19

计算机毕业设计springbootTK健身俱乐部 SpringBoot 驱动的智慧健身中心综合运营平台 基于 SpringBoot 的全链路健身会所信息管理系统

计算机毕业设计springbootTK健身俱乐部93pms830 &#xff08;配套有源码 程序 mysql数据库 论文&#xff09; 本套源码可以在文本联xi,先看具体系统功能演示视频领取&#xff0c;可分享源码参考。在“互联网体育”的大潮下&#xff0c;传统健身房的手工排课、纸质会员卡、器材借…

作者头像 李华
网站建设 2026/7/7 12:51:16

计算机毕业设计springboot乐然游泳馆管理系统 基于SpringBoot的“泳动”智慧游泳馆运营平台 SpringBoot+Vue的“水方”游泳馆一站式预约管理系统

计算机毕业设计springboot乐然游泳馆管理系统1v3q256t &#xff08;配套有源码 程序 mysql数据库 论文&#xff09; 本套源码可以在文本联xi,先看具体系统功能演示视频领取&#xff0c;可分享源码参考。当泳池里的浪花遇上代码&#xff0c;管理就不再是人工的“狗刨”。在后疫情…

作者头像 李华
网站建设 2026/7/7 13:38:45

Unity学习笔记(十八)GUI控件(二)

输入框普通输入 inputStr 为默认的显示内容&#xff0c; 10为最大输入长度 可自定义。返回值为StringinputStr GUI.TextField(new Rect(0, 20, 100, 30), inputStr, 10);密码输入 用*号替换密码密码inputPwd GUI.PasswordField(new Rect(0, 50, 100, 30), inputPwd, *);拖…

作者头像 李华