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 的基础知识:
- 对连续数据(数组、向量、原始缓冲区)的非拥有型视图。
- 保存一个指针和长度;不进行复制或分配。
constspan 是只读的;可变 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 反馈 — 无需本地设置。
此课程中的所有课时
- 定长 std::array
- std::span 基础
- 向函数传递 Span
- 边界与子 Span