字符串算法
高效搜索和拆分
字符串算法 是 CoddyKit 上的免费 C++ Academy 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 C++ Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 C++ Academy 课程共包含 4 节课。
使用 find 进行查找
find 返回子字符串的索引;如果不存在,则返回 npos,整个过程直接在视图上进行,不会复制数据。
#include <iostream>
#include <string_view>
int main() {
std::string_view sv = "key=value";
auto pos = sv.find('=');
std::cout << pos << "\n"; // 3
}检查 npos
在将查找结果用作索引之前,请始终将它与 std::string_view::npos 进行比较。
#include <iostream>
#include <string_view>
int main() {
std::string_view sv = "abc";
if (sv.find('z') == std::string_view::npos)
std::cout << "not found\n";
}检查前缀和后缀
starts_with 和 ends_with(C++20)能清晰表达意图,并避免手动比较子字符串。
#include <iostream>
#include <string_view>
int main() {
std::string_view sv = "report.pdf";
std::cout << sv.starts_with("report") << "\n";
std::cout << sv.ends_with(".pdf") << "\n";
}提取字段
将 find 与 substr 结合使用,可以拆分键值对,而无需分配新的字符串。
#include <iostream>
#include <string_view>
int main() {
std::string_view sv = "name=Ada";
auto eq = sv.find('=');
std::cout << sv.substr(0, eq) << " : " << sv.substr(eq + 1) << "\n";
}按分隔符拆分
您可以反复查找分隔符并获取子视图,从而遍历各个词元;每个词元都只是一个视图。
#include <iostream>
#include <string_view>
int main() {
std::string_view sv = "a,b,c";
size_t start = 0, pos;
while ((pos = sv.find(',', start)) != std::string_view::npos) {
std::cout << sv.substr(start, pos - start) << "\n";
start = pos + 1;
}
std::cout << sv.substr(start) << "\n";
}从末尾开始查找
rfind 会反向查找,适合获取文件扩展名或最后一个分隔符的位置。
#include <iostream>
#include <string_view>
int main() {
std::string_view path = "/usr/local/bin";
auto slash = path.rfind('/');
std::cout << path.substr(slash + 1) << "\n"; // bin
}去除空白
将 find_first_not_of 和 find_last_not_of 与 remove_prefix/remove_suffix 结合使用即可进行修剪,而且全程无需复制。
#include <iostream>
#include <string_view>
int main() {
std::string_view sv = " hi ";
sv.remove_prefix(sv.find_first_not_of(" "));
sv.remove_suffix(sv.size() - 1 - sv.find_last_not_of(" "));
std::cout << "[" << sv << "]\n"; // [hi]
}比较视图
视图支持使用 == 和 compare 进行字典序比较;比较的是字符,而不是指针。
#include <iostream>
#include <string_view>
int main() {
std::string_view a = "apple", b = "apple";
std::cout << (a == b) << "\n"; // 1
}统计出现次数
通过循环使用 find,并在每次找到匹配项后向后移动,可以统计某个字符或子字符串出现的次数。
#include <iostream>
#include <string_view>
int main() {
std::string_view sv = "mississippi";
int count = 0;
for (size_t p = sv.find('s'); p != std::string_view::npos; p = sv.find('s', p + 1)) ++count;
std::cout << count << "\n"; // 4
}算法无需分配内存
所有这些操作都作用于同一个底层缓冲区。词元和修剪后的结果都是子视图,只有在构造 std::string 时才会进行堆分配。
注意生命周期
这些算法生成的子视图与原始缓冲区共享生命周期。不要让它们的生命周期超过源字符串。
快速检查
检查您对 string_view 算法的理解。
回顾
您学习了在视图上使用字符串算法:
find/rfind返回位置或npos。starts_with/ends_with用于检查前缀和后缀。- 拆分、修剪和词法切分都会生成无需分配内存的子视图。
- 子视图与源对象共享生命周期,请注意悬空问题。
常见问题解答
「字符串算法」课时是免费的吗?
是的 — 「字符串算法」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 C++ Academy 课程的其余内容,请升级到 CoddyKit PRO。 C++ Academy 课程共包含 4 节课。
「字符串算法」这节课中我会学到什么?
高效搜索和拆分 你通过在浏览器中直接运行的动手代码来练习 C++ Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 C++ Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 C++ Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。
「字符串算法」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 C++ Academy 课中编写并运行代码吗?
能。每节 C++ Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。