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

6.25小学期CPP基础语法记录:反转、字符串查找、稳定sort

reverse函数

在 C++ 中,reverse是一个非常常用的 STL 算法,用于就地反转序列中的元素顺序。它定义在<algorithm>头文件中。

🧩 函数定义

template <class BidirectionalIterator> void reverse(BidirectionalIterator first, BidirectionalIterator last);
  • 参数说明:
    • first:反转范围的起始迭代器(包含)。
    • last:反转范围的终止迭代器(不包含)。
  • 返回值:
    • 无(void),它是就地修改,直接在原容器上改变顺序。
  • 迭代器要求:
    • 必须是双向迭代器(如vector,list,deque都支持;forward_list不支持)。

✅ 示例

1. 反转vector<int>

#include <iostream> #include <vector> #include <algorithm> // for reverse int main() { std::vector<int> v = {1, 2, 3, 4, 5}; std::reverse(v.begin(), v.end()); for (int i : v) std::cout << i << " "; return 0; }

输出:

5 4 3 2 1

2. 反转string(也支持,因为string::iterator是双向的)

#include <iostream> #include <string> #include <algorithm> int main() { std::string s = "abcdef"; std::reverse(s.begin(), s.end()); std::cout << s; // 输出: fedcba return 0; }

3. 局部反转

cpp复制编辑std::vector<int> v = {10, 20, 30, 40, 50, 60}; // 只反转中间部分 [1, 4) std::reverse(v.begin() + 1, v.begin() + 4); // -> 10, 40, 30, 20, 50, 60

🚀 reverse 的底层实现原理

使用的是双向迭代器,通过交换frontback元素来实现反转。

伪代码:

while (first != last && first != --last) { swap(*first, *last); ++first; }

🎯 时间复杂度与空间复杂度

  • 时间复杂度:O(n)
  • 空间复杂度:O(1)(原地操作,不使用额外空间)

🎓 举一反三

  • std::reverse_copy(first, last, dest):把反转结果复制到另一个位置,不影响原数据。
std::vector<int> v = {1,2,3,4,5}; std::vector<int> res(5); std::reverse_copy(v.begin(), v.end(), res.begin()); // res = 5,4,3,2,1
  • 如果你想自己实现一个reverse函数,可以练习写模板函数操作双向迭代器。

🔍 string::find函数

C++ 中的string::find是处理字符串查找的核心函数,常用于查找某个子串或字符第一次出现的位置。下面我们详细分析它的用法、变体、返回值,再拓展介绍其他常见的字符串查找函数,比如rfindfind_first_offind_last_offind_first_not_of等。

🔍 一、string::find基本用法

size_t find(const string& str, size_t pos = 0) const; size_t find(const char* s, size_t pos = 0) const; size_t find(const char* s, size_t pos, size_t n) const; size_t find(char c, size_t pos = 0) const;

✅ 参数说明:

  • str/s/c: 要查找的目标字符串/字符
  • pos: 从原字符串的哪个位置开始查找(默认为 0)。

✅ 返回值:

  • 成功:返回目标第一次出现的位置(类型为size_t)。
  • 失败:返回string::npos(一个极大的无符号整数,表示未找到)。

🔧 示例一:查找子串

std::string s = "hello world"; size_t pos = s.find("world"); // 返回 6

🔧 示例二:查找字符

std::string s = "abcabc"; size_t pos = s.find('b'); // 返回 1,第一个 b 的位置

🔧 示例三:未找到

std::string s = "hello"; size_t pos = s.find("abc"); if (pos == std::string::npos) std::cout << "not found";

🔧 示例四:从指定位置开始查找

std::string s = "abcabc"; size_t pos = s.find('b', 2); // 返回 4,跳过前面的 b

🎯 二、其他查找方法汇总

1️⃣rfind:从右往左找(返回最后一次出现的位置)

std::string s = "abcabc"; size_t pos = s.rfind('b'); // 返回 4

2️⃣find_first_of:查找任一字符第一次出现的位置

std::string s = "hello world"; size_t pos = s.find_first_of("aeiou"); // 返回 1,‘e’是第一个元音

3️⃣find_last_of:查找任一字符最后一次出现的位置

std::string s = "abcabc"; size_t pos = s.find_last_of("ab"); // 返回 4,‘b’在位置4最后出现

4️⃣find_first_not_of:找第一个不是指定字符集的字符

std::string s = "aaaabc"; size_t pos = s.find_first_not_of('a'); // 返回 4,‘b’不是 ‘a’

5️⃣find_last_not_of:找最后一个不是指定字符集的字符

std::string s = "abcddd"; size_t pos = s.find_last_not_of('d'); // 返回 2,‘c’不是 ‘d’

📘 实战对比与举一反三

函数名含义查找方向典型用途
find第一次出现左→右查找特定子串或字符
rfind最后一次出现右→左查找最后一个位置
find_first_of第一次出现(任一)左→右查找多个候选字符之一
find_last_of最后一次出现(任一)右→左
find_first_not_of第一个不是指定字符
http://www.jsqmd.com/news/1105674/

相关文章:

  • STM32G491RE与TPAFE0808实现多通道信号采集方案
  • GPT-5.5 多智能体协作能力初探:构建自主任务流的技术验证
  • 【课程设计/毕业设计】基于 SpringBoot 的宠物医院物资设备一体化管理系统的设计与实现【附源码、数据库、万字文档】
  • 知医邦ChatiSS查体大模型:四大核心应用场景全面赋能中医全生命周期
  • 别再Ctrl+F了!用IDEA书签实现毫秒级代码定位(附性能对比数据:平均跳转耗时降低87.3%)
  • 5分钟解锁3D魔法:用Deep3D让普通视频瞬间立体化!
  • Python自动化测试实战:从Selenium到Playwright,构建高效测试框架
  • Linux打印机驱动配置终极指南:foo2zjs让100+型号打印机完美工作
  • MAA明日方舟智能助手完整使用指南:5分钟快速上手解放双手
  • 2026年7月最新小程序开发公司深度评测:技术实力、交付能力与行业口碑全景解析,含零代码SAAS、AI编程、源码定制
  • 游戏机变身B站神器:wiliwili让你的Switch、PSVita秒变追番利器
  • 【Springboot毕设全套源码+文档】基于Java+springboot家装项目管理系统的设计与实现(丰富项目+远程调试+讲解+定制)
  • 全面解锁Nintendo Switch潜能:Atmosphere大气层系统深度解析
  • Linux应急响应实战:从入侵检测到溯源加固的必备工具集
  • IDEA依赖冲突解决全攻略:5步定位+3招修复+1键清理,Maven Helper实战手册限时公开
  • Ubuntu 18.04下phpMyAdmin安全加固实战指南
  • ASM330LHH与TM4C123GH6PZ运动跟踪系统设计
  • AI率总超标?2026年AI写作辅助软件排行榜权威发布,一次过审不是梦!
  • 巨杉数据库的msyql兼容模式关于对象存储的功能
  • MC74HC165A并行输入芯片在嵌入式系统中的应用与优化
  • TomcatScanPro:自动化Tomcat安全扫描与漏洞利用实战指南
  • Hermes接入stepfun阶跃星辰Step API教程(使用step-3.7-flash大模型)
  • SSH密钥交换算法加固指南:从CVE漏洞到现代ECDH配置实战
  • Flux2 文生图/图生图整合包本地化部署与极限显存优化
  • 保姆级教程:让你的 Node.js 应用永远在线的神器——PM2
  • LLM代码生成不是自我编程,而是软件工作流重编排
  • C++ 基础知识体系与重点梳理
  • TV Bro:如何在电视上用遥控器轻松上网?终极指南告诉你!
  • okbiye 毕业论文 AI 创作实测|页面功能逐项拆解,一站式写论文全流程详解
  • 别再手动改配置了!IDEA一键切换Spring Boot Profile的4种工业级方案,第2种已获Spring官方文档引用