0Pricing
C++ Academy · 课时

std::span 基础

连续数据上的非所有权视图

std::span 基础 是 CoddyKit 上的免费 C++ Academy 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 C++ Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 C++ Academy 课程共包含 4 节课。

非拥有型视图

std::span<T>(C++20)是对连续序列的轻量级视图,类似于 string_view,但适用于任意元素类型。请包含 <span>。

#include <iostream>
#include <span>
#include <array>
int main() {
    std::array<int, 3> a = {1, 2, 3};
    std::span<int> s = a;
    std::cout << s.size() << "\n";
}

Span 不拥有数据

span 存储一个指针和一个长度;它观察由其他对象拥有的数据,从不复制元素。

#include <iostream>
#include <vector>
#include <span>
int main() {
    std::vector<int> v = {5, 6, 7};
    std::span<int> s = v;
    s[0] = 50; // modifies v
    std::cout << v[0] << "\n"; // 50
}

来自 std::array

数组可以自动转换为 span,该 span 可以看到数组的所有元素。

#include <iostream>
#include <span>
#include <array>
int main() {
    std::array<int, 4> a = {1, 2, 3, 4};
    std::span<int> s{a};
    for (int x : s) std::cout << x << " ";
    std::cout << "\n";
}

来自向量

std::vector 也可以转换为 span,从而无论底层容器是什么,都能提供统一的视图。

#include <iostream>
#include <vector>
#include <span>
int main() {
    std::vector<int> v = {9, 8, 7};
    std::span<int> s = v;
    std::cout << s.front() << " " << s.back() << "\n";
}

来自指针和大小

可以根据原始指针和元素数量构造 span,这对 C 风格的缓冲区很有用。

#include <iostream>
#include <span>
int main() {
    int buf[] = {10, 20, 30};
    std::span<int> s(buf, 3);
    std::cout << s[1] << "\n"; // 20
}

遍历 Span

Span 支持基于范围的 for 循环以及常见的容器接口(size、front、back、data)。

#include <iostream>
#include <span>
int main() {
    int buf[] = {2, 4, 6, 8};
    std::span<int> s(buf, 4);
    int sum = 0;
    for (int x : s) sum += x;
    std::cout << sum << "\n"; // 20
}

只读 Span

std::span<const int> 提供只读访问;当函数不应修改数据时,请使用它。

#include <iostream>
#include <span>
int main() {
    int buf[] = {1, 2, 3};
    std::span<const int> s(buf, 3);
    std::cout << s[2] << "\n"; // 3
}

通过 Span 修改数据

非 const span 可以修改底层元素,因为它指向真实数据。

#include <iostream>
#include <span>
int main() {
    int buf[] = {1, 1, 1};
    std::span<int> s(buf, 3);
    for (int& x : s) x *= 10;
    std::cout << buf[2] << "\n"; // 10
}

动态范围与静态范围

默认情况下,span 的大小是动态的,但可以使用 std::span<int, 3> 在编译时固定大小,以获得额外检查。

无需分配,传递开销低

与所有视图一样,span 的复制和按值传递开销都很低,因为它只携带一个指针和一个长度。

注意生命周期

span 仅在其源对象仍然存在且未重新分配期间有效。不要保留指向之后会增长的向量的 span。

快速检查

检查您对 std::span 的理解。

回顾

您学习了 std::span 的基础知识:

  • 对连续数据(数组、向量、原始缓冲区)的非拥有型视图。
  • 保存一个指针和长度;不进行复制或分配。
  • const span 是只读的;可变 span 可以编辑源数据。
  • 仅在源对象存在期间有效。

常见问题解答

「std::span 基础」课时是免费的吗?

是的 — 「std::span 基础」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 C++ Academy 课程的其余内容,请升级到 CoddyKit PRO。 C++ Academy 课程共包含 4 节课。

「std::span 基础」这节课中我会学到什么?

连续数据上的非所有权视图 你通过在浏览器中直接运行的动手代码来练习 C++ Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 C++ Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 C++ Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。

「std::span 基础」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 C++ Academy 课中编写并运行代码吗?

能。每节 C++ Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 定长 std::array
  2. std::span 基础
  3. 向函数传递 Span
  4. 边界与子 Span
← 返回 C++ Academy