为什么使用 string_view
避免复制字符串
为什么使用 string_view 是 CoddyKit 上的免费 C++ Academy 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 C++ Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 C++ Academy 课程共包含 4 节课。
复制的代价
按值传递 std::string 会复制整个缓冲区。对于只读访问而言,这种复制是没有必要的开销。std::string_view 是一种轻量级的非拥有视图,本质上只有一个指针和一个长度。请包含 <string_view>。
#include <iostream>
#include <string_view>
int main() {
std::string_view sv = "hello";
std::cout << sv << " len=" << sv.size() << "\n";
}视图保存什么
string_view 只保存指向现有字符的指针和长度。它不拥有数据,也不会复制数据。
#include <iostream>
#include <string>
#include <string_view>
int main() {
std::string s = "world";
std::string_view sv = s; // views s, no copy
std::cout << sv << "\n";
}只读参数
接收 std::string_view 意味着您的函数可以处理 std::string、字符串字面量和 char 数组,而且不会复制其中任何内容。
#include <iostream>
#include <string_view>
void greet(std::string_view name) {
std::cout << "Hi, " << name << "\n";
}
int main() {
greet("Ada");
greet(std::string("Bob"));
}不进行分配
创建视图不会分配内存,因此复制视图以及按值传递视图的成本都很低。
#include <iostream>
#include <string_view>
int main() {
std::string_view a = "constant text";
std::string_view b = a; // trivial copy
std::cout << (a == b) << "\n";
}低成本的子字符串
对视图调用 substr 会返回指向同一内存的另一个视图,不会复制任何字符。
#include <iostream>
#include <string_view>
int main() {
std::string_view sv = "abcdef";
std::cout << sv.substr(2, 3) << "\n"; // cde
}体现性能意图
对于只检查文本的函数,string_view 可以同时避免堆分配和复制,这在热点循环和解析操作中很重要。
长度和索引
视图支持熟悉的接口:size()、empty()、索引访问以及基于范围的迭代。
#include <iostream>
#include <string_view>
int main() {
std::string_view sv = "C++";
for (char c : sv) std::cout << c << "-";
std::cout << "\n" << sv.size() << "\n";
}视图是只读的
您不能通过 string_view 修改字符;它只提供读取权限。要修改字符,您需要使用拥有数据的字符串。
从字面量转换为视图
字符串字面量可以直接转换为视图,因此传递常量文本的成本极低。
#include <iostream>
#include <string_view>
using namespace std::string_view_literals;
int main() {
auto sv = "literal"sv;
std::cout << sv.size() << "\n";
}不是 string 的替代品
当您需要拥有、存储或修改文本时,请使用 std::string。对于临时的只读参数,请使用 std::string_view。
生命周期注意事项
由于视图不拥有数据,因此底层字符的生命周期必须长于视图。误用会导致悬空视图,后续课程将介绍这一问题。
快速检查
检查您对 string_view 设计动机的理解。
回顾
您学习了string_view 存在的原因:
- 它是一个不拥有数据的“指针 + 长度”视图。
- 接收它可以避免复制只读文本以及进行内存分配。
- 它适用于字符串、字面量和 char 数组。
- 被查看的数据生命周期必须长于视图。
常见问题解答
「为什么使用 string_view」课时是免费的吗?
是的 — 「为什么使用 string_view」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 C++ Academy 课程的其余内容,请升级到 CoddyKit PRO。 C++ Academy 课程共包含 4 节课。
「为什么使用 string_view」这节课中我会学到什么?
避免复制字符串 你通过在浏览器中直接运行的动手代码来练习 C++ Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 C++ Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 C++ Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。
「为什么使用 string_view」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 C++ Academy 课中编写并运行代码吗?
能。每节 C++ Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。