0Pricing
C++ Academy · 课时

为什么使用 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 反馈 — 无需本地设置。

此课程中的所有课时

  1. 为什么使用 string_view
  2. 创建视图
  3. 陷阱与生命周期
  4. 字符串算法
← 返回 C++ Academy