跳转到内容
主菜单
主菜单
移至侧栏
隐藏
导航
首页
最近更改
随机页面
MediaWiki帮助
代码酷
搜索
搜索
中文(中国大陆)
外观
创建账号
登录
个人工具
创建账号
登录
未登录编辑者的页面
了解详情
贡献
讨论
编辑“︁
C++ 字符串算法
”︁
页面
讨论
大陆简体
阅读
编辑
编辑源代码
查看历史
工具
工具
移至侧栏
隐藏
操作
阅读
编辑
编辑源代码
查看历史
常规
链入页面
相关更改
特殊页面
页面信息
外观
移至侧栏
隐藏
您的更改会在有权核准的用户核准后向读者展示。
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
预览
高级
特殊字符
帮助
标题
2级
3级
4级
5级
格式
插入
拉丁字母
扩展拉丁字母
国际音标
符号
希腊字母
希腊字母扩展
西里尔字母
阿拉伯字母
扩展阿拉伯字母
希伯来字母
孟加拉语字符集
泰米尔数字和符号
泰卢固语字符集
僧伽罗语字符集
梵文字符集
古吉拉特语字符集
泰语字符集
老挝语
高棉语字母
加拿大原住民音节文字
卢恩
Á
á
À
à
Â
â
Ä
ä
Ã
ã
Ǎ
ǎ
Ā
ā
Ă
ă
Ą
ą
Å
å
Ć
ć
Ĉ
ĉ
Ç
ç
Č
č
Ċ
ċ
Đ
đ
Ď
ď
É
é
È
è
Ê
ê
Ë
ë
Ě
ě
Ē
ē
Ĕ
ĕ
Ė
ė
Ę
ę
Ĝ
ĝ
Ģ
ģ
Ğ
ğ
Ġ
ġ
Ĥ
ĥ
Ħ
ħ
Í
í
Ì
ì
Î
î
Ï
ï
Ĩ
ĩ
Ǐ
ǐ
Ī
ī
Ĭ
ĭ
İ
ı
Į
į
Ĵ
ĵ
Ķ
ķ
Ĺ
ĺ
Ļ
ļ
Ľ
ľ
Ł
ł
Ń
ń
Ñ
ñ
Ņ
ņ
Ň
ň
Ó
ó
Ò
ò
Ô
ô
Ö
ö
Õ
õ
Ǒ
ǒ
Ō
ō
Ŏ
ŏ
Ǫ
ǫ
Ő
ő
Ŕ
ŕ
Ŗ
ŗ
Ř
ř
Ś
ś
Ŝ
ŝ
Ş
ş
Š
š
Ș
ș
Ț
ț
Ť
ť
Ú
ú
Ù
ù
Û
û
Ü
ü
Ũ
ũ
Ů
ů
Ǔ
ǔ
Ū
ū
ǖ
ǘ
ǚ
ǜ
Ŭ
ŭ
Ų
ų
Ű
ű
Ŵ
ŵ
Ý
ý
Ŷ
ŷ
Ÿ
ÿ
Ȳ
ȳ
Ź
ź
Ž
ž
Ż
ż
Æ
æ
Ǣ
ǣ
Ø
ø
Œ
œ
ß
Ð
ð
Þ
þ
Ə
ə
格式
链接
标题
列表
文件
讨论
参考
说明
输入内容
输出结果
斜体
''斜体文字''
斜体文字
粗体
'''粗体文字'''
粗体文字
粗斜体
'''''粗斜体文字'''''
粗斜体文字
说明
输入内容
输出结果
参考资料
页面文本。<ref>[https://www.example.org/ 链接文本],其他文本。</ref>
页面文本。
[1]
命名参考资料
页面文本。<ref name="测试">[https://www.example.org/ 链接文本]</ref>
页面文本。
[2]
复用参考资料
页面文本。<ref name="测试" />
页面文本。
[2]
显示参考资料列表
<references />
↑
链接文本
,其他文本。
↑
链接文本
= C++字符串算法 = '''C++字符串算法'''是处理和分析文本数据的基础工具集,涵盖从简单搜索到复杂模式匹配的操作。标准库 `<algorithm>` 和 `<string>` 提供了丰富的函数,结合迭代器可实现高效字符串处理。本专题将系统讲解核心算法及其应用场景。 == 核心算法分类 == 字符串算法可分为以下几类: * '''查找与搜索''':子串定位、字符匹配 * '''修改与转换''':大小写转换、替换 * '''分割与连接''':基于分隔符拆分字符串 * '''比较与验证''':字典序比较、格式校验 <mermaid> pie title 字符串算法使用频率 "查找与搜索" : 35 "修改与转换" : 25 "分割与连接" : 20 "比较与验证" : 20 </mermaid> == 基础查找算法 == === find() 系列函数 === 在字符串中定位子串或字符的最基础方法: <syntaxhighlight lang="cpp"> #include <string> #include <iostream> int main() { std::string text = "The quick brown fox jumps over the lazy dog"; size_t pos = text.find("fox"); // 返回首次出现的位置 if (pos != std::string::npos) { std::cout << "Found at position: " << pos << "\n"; // 输出: 16 } else { std::cout << "Not found\n"; } } </syntaxhighlight> 关键点: * 返回类型为 `size_t`,失败时返回 `std::string::npos` * 变体函数: * `rfind()`:反向搜索 * `find_first_of()`:查找字符集合中任意字符 * `find_last_not_of()`:查找不在指定集合的最后字符 == 高级模式匹配 == === 正则表达式(C++11起) === `<regex>` 库提供完整的正则表达式支持: <syntaxhighlight lang="cpp"> #include <regex> #include <string> void validate_email(const std::string& email) { std::regex pattern(R"([a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,})"); if (std::regex_match(email, pattern)) { std::cout << "Valid email\n"; } else { std::cout << "Invalid email\n"; } } </syntaxhighlight> 正则表达式组件说明: * `[]`:字符集合 * `+`:1次或多次重复 * `\.`:转义点号 * `{2,}`:至少2次重复 == 字符串转换 == === 数值转换(C++11起) === 安全类型转换方法: <syntaxhighlight lang="cpp"> #include <string> #include <stdexcept> void convert_example() { std::string num_str = "3.14159"; try { double pi = std::stod(num_str); // 字符串转double int integer = std::stoi("42"); // 字符串转int } catch (const std::invalid_argument& e) { std::cerr << "Conversion failed: " << e.what() << '\n'; } } </syntaxhighlight> == 实用算法案例 == === 单词频率统计 === 结合map容器实现文本分析: <syntaxhighlight lang="cpp"> #include <map> #include <sstream> #include <algorithm> void word_counter(const std::string& text) { std::map<std::string, int> freq; std::istringstream iss(text); std::string word; while (iss >> word) { // 转换为小写并统计 std::transform(word.begin(), word.end(), word.begin(), ::tolower); ++freq[word]; } // 输出结果 for (const auto& [w, count] : freq) { std::cout << w << ": " << count << '\n'; } } </syntaxhighlight> == 性能优化技巧 == 1. '''预留空间''':使用 `reserve()` 预分配内存避免重复分配 <syntaxhighlight lang="cpp"> std::string large_str; large_str.reserve(100000); // 预分配100KB </syntaxhighlight> 2. '''移动语义''':C++11后优先使用移动而非复制 <syntaxhighlight lang="cpp"> std::string process_text(std::string&& input) { // 处理输入字符串 return std::move(input); // 移动而非复制 } </syntaxhighlight> 3. '''视图模式''':C++17的 `string_view` 避免不必要的复制 <syntaxhighlight lang="cpp"> void analyze(std::string_view text) { // 只读操作无需复制原字符串 } </syntaxhighlight> == 复杂度分析 == 常见操作的时间复杂度(n为字符串长度): {| class="wikitable" |+ 时间复杂度对照表 ! 操作 !! 复杂度 |- | `find()`/`rfind()` || O(n) |- | `substr()` || O(n) |- | `operator+` || O(n+m) |- | `push_back()` || 平均O(1) |} 数学表示:<math>O(n)</math> 表示线性时间复杂度 == 进阶话题 == * '''Unicode处理''':使用ICU库处理多语言文本 * '''并行算法''':C++17的并行执行策略加速处理 * '''字符串压缩''':结合zlib等库实现高效存储 == 练习题目 == 1. 实现反转字符串的函数,要求原地修改 2. 编写检测回文字符串的算法(忽略大小写和标点) 3. 设计字符串压缩算法(如"aaabbbcc"→"a3b3c2") 通过系统掌握这些算法,开发者可高效解决90%以上的文本处理需求。建议结合实际问题进行针对性练习,逐步深入理解各算法的适用场景和优化方法。 [[Category:编程语言]] [[Category:C++]] [[Category:C++ 字符串]]
摘要:
请注意,所有对代码酷的贡献均被视为依照知识共享署名-非商业性使用-相同方式共享发表(详情请见
代码酷:著作权
)。如果您不希望您的文字作品被随意编辑和分发传播,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)