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

C++ 中 rfind 方法详解

rfind 是 C++ 字符串类 std::stringstd::wstring 的成员函数,用于从字符串的末尾向前搜索指定的子字符串或字符。

函数原型

// 搜索整个字符串
size_type rfind(const basic_string& str, size_type pos = npos) const noexcept;
size_type rfind(const CharT* s, size_type pos = npos) const;
size_type rfind(CharT ch, size_type pos = npos) const noexcept;// C++17 新增:带长度的版本
size_type rfind(const CharT* s, size_type pos, size_type count) const;

参数说明

  • str / s / ch:要搜索的子字符串或字符
  • pos:开始搜索的位置(从该位置向前搜索)
  • count:要搜索的字符数(仅用于指针版本)

返回值

  • 如果找到,返回匹配子串的起始位置(从 0 开始)
  • 如果未找到,返回 std::string::npos

源码解析

以下是 rfind 的简化实现原理:

#include <iostream>
#include <string>
#include <cstring>// 简化的 rfind 实现原理
size_t simplified_rfind(const std::string& str, const std::string& pattern, size_t pos = std::string::npos) {// 如果 pos 超过字符串长度,调整到字符串末尾if (pos >= str.length()) {pos = str.length() - 1;}// 如果模式串为空,返回 pos(标准行为)if (pattern.empty()) {return (pos < str.length()) ? pos : str.length();}// 如果模式串比原字符串长,肯定找不到if (pattern.length() > str.length()) {return std::string::npos;}// 从 pos 开始向前搜索for (size_t i = pos; i >= pattern.length() - 1; --i) {bool found = true;// 检查当前位置是否匹配模式串for (size_t j = 0; j < pattern.length(); ++j) {if (str[i - pattern.length() + 1 + j] != pattern[j]) {found = false;break;}}if (found) {return i - pattern.length() + 1;}// 处理无符号整数的下溢if (i == 0) break;}return std::string::npos;
}

使用示例

#include <iostream>
#include <string>int main() {std::string text = "Hello, World! Hello, C++!";// 1. 搜索子字符串size_t pos1 = text.rfind("Hello");std::cout << "Last 'Hello' at position: " << pos1 << std::endl; // 输出 14// 2. 搜索字符size_t pos2 = text.rfind('o');std::cout << "Last 'o' at position: " << pos2 << std::endl; // 输出 19// 3. 从指定位置向前搜索size_t pos3 = text.rfind("Hello", 10);std::cout << "Last 'Hello' before position 10: " << pos3 << std::endl; // 输出 0// 4. 搜索不存在的字符串size_t pos4 = text.rfind("Python");if (pos4 == std::string::npos) {std::cout << "'Python' not found" << std::endl;}// 5. 使用指针和长度const char* search_str = "Hello";size_t pos5 = text.rfind(search_str, text.length(), 3); // 只搜索前3个字符 "Hel"std::cout << "Last 'Hel' at position: " << pos5 << std::endl;return 0;
}

实际应用场景

#include <iostream>
#include <string>// 提取文件扩展名
std::string getFileExtension(const std::string& filename) {size_t dotPos = filename.rfind('.');if (dotPos != std::string::npos && dotPos < filename.length() - 1) {return filename.substr(dotPos + 1);}return "";
}// 提取目录路径
std::string getDirectory(const std::string& path) {size_t slashPos = path.rfind('/');if (slashPos != std::string::npos) {return path.substr(0, slashPos + 1);}return "";
}// 查找最后一个单词
std::string getLastWord(const std::string& sentence) {size_t lastSpace = sentence.rfind(' ');if (lastSpace != std::string::npos) {return sentence.substr(lastSpace + 1);}return sentence; // 没有空格,返回整个字符串
}int main() {std::string filename = "document.backup.txt";std::string path = "/home/user/documents/file.txt";std::string sentence = "The quick brown fox";std::cout << "File extension: " << getFileExtension(filename) << std::endl;std::cout << "Directory: " << getDirectory(path) << std::endl;std::cout << "Last word: " << getLastWord(sentence) << std::endl;return 0;
}

性能特点

  • 时间复杂度:最坏情况 O(n×m),其中 n 是搜索范围,m 是模式串长度
  • 空间复杂度:O(1)
  • 适用场景:适合在长字符串中查找较短的模式串

注意事项

  1. rfind 从后向前搜索,但返回的位置是从字符串开头计算的
  2. 如果 pos 参数为 npos,则从字符串末尾开始搜索
  3. 空字符串的搜索总是会成功(返回 pos 或字符串长度)
  4. 注意处理 npos 的返回值

rfind 是字符串处理中非常有用的工具,特别适合需要从后向前搜索的场景,如文件路径处理、URL 解析等。

http://www.dtcms.com/a/464750.html

相关文章:

  • SpringBoot 教程(十四) SpringBoot之集成 Redis(优化版)
  • 【Linux】线程同步与互斥(上)
  • 图观 模型编辑器
  • Win11 输入延迟与鼠标卡顿:系统化排查与优化指南
  • 【开题答辩全过程】以 爱运动健身小程序的设计与实现为例,包含答辩的问题和答案
  • Linux 内核IIO sensor驱动
  • 《Linux系统编程之入门基础》【Linux的前世今生】
  • 活动汪活动策划网站龙岗建设网站
  • Apache IoTDB 架构特性与 Prometheus+Grafana 监控体系部署实践
  • LLM时代基于unstructured解析非结构化pdf
  • uniapp tab切换及tab锚点效果(wx小程序及H5端)
  • Hadoop面试题及详细答案 110题 (71-85)-- 集群部署与运维
  • 5-1〔OSCP ◈ 研记〕❘ SQL注入攻击▸SQL注入理论基础
  • 南充市企业网站建设wordpress极客主题
  • 企业做小红书关键词搜索排名推广时,怎么找到小红书上有一定搜索量但竞争度低的蓝海词?
  • 数据仓库与数据挖掘基础知识
  • 鸿蒙:使用Rating组件实现五角星打分评价
  • 外国人可以在中国做网站吗做个网站得花多少钱
  • 双均线策略
  • 【vLLM 学习】Neuron
  • 网站做行业认证好处施工企业在施工过程中发现工程设计图纸存在差错的
  • 迅为RK3576开发板挂载Windows以及虚拟机Ubuntu测试
  • 第1篇:创建基础电商AI客服
  • 【MyBatis从入门到入土】告别JDBC原始时代:零基础MyBatis极速上手指南
  • MaxScript 科研绘图教程:从数据到精确的可视化
  • org.apache.http.conn.HttpHostConnectException: Connect to localhost:8086
  • 深度学习入门(一)——从神经元到损失函数,一步步理解前向传播(上)
  • 沧州网站制作公司宁波网站的优化
  • 工程承包去哪个网站做网站的步骤 优帮云
  • 网站建设课程wordpress 去掉左上角