What is a quot;spanquot; and when should I use one?(什么是“跨度?我什么时候应该使用一个?)
问题描述
最近我收到了在我的代码中使用 span<T>
的建议,或者在使用 span
的网站上看到了一些答案 -据说是某种容器.但是 - 我在 C++17 标准库中找不到类似的东西.
Recently I've gotten suggestions to use span<T>
's in my code, or have seen some answers here on the site which use span
's - supposedly some kind of container. But - I can't find anything like that in the C++17 standard library.
那么这个神秘的 span<T>
是什么?为什么(或何时)使用它是非标准的好主意?
So what is this mysterious span<T>
, and why (or when) is it a good idea to use it if it's non-standard?
推荐答案
是什么?
A span
是:
- 对内存中某处
T
类型的连续值序列的非常轻量级的抽象. - 基本上是一个
struct { T * ptr;std::size_t 长度;}
有很多方便的方法. - 非拥有类型(即引用类型" 而不是值类型"):它从不分配或解除分配任何东西,也不使智能指针保持活动状态.
- A very lightweight abstraction of a contiguous sequence of values of type
T
somewhere in memory. - Basically a
struct { T * ptr; std::size_t length; }
with a bunch of convenience methods. - A non-owning type (i.e. a "reference-type" rather than a "value type"): It never allocates nor deallocates anything and does not keep smart pointers alive.
它以前称为 array_view
,甚至更早称为 array_ref
.
It was formerly known as an array_view
and even earlier as array_ref
.
首先,当不使用它时:
- 不要在可能只需要任何一对 start & 的代码中使用它.结束迭代器,例如
std::sort
、std::find_if
、std::copy
和所有这些超通用模板化函数. - 如果您有一个标准库容器(或 Boost 容器等)并且您知道它适合您的代码,请不要使用它.它无意取代其中任何一个.
- Don't use it in code that could just take any pair of start & end iterators, like
std::sort
,std::find_if
,std::copy
and all of those super-generic templated functions. - Don't use it if you have a standard library container (or a Boost container etc.) which you know is the right fit for your code. It's not intended to supplant any of them.
现在是什么时候真正使用它:
Now for when to actually use it:
使用span
(分别为span
)而不是独立的T*
(分别为const T*
) 当分配的长度或大小也很重要时.因此,替换如下函数:
Use
span<T>
(respectively,span<const T>
) instead of a free-standingT*
(respectivelyconst T*
) when the allocated length or size also matter. So, replace functions like:
void read_into(int* buffer, size_t buffer_size);
与:
void read_into(span<int> buffer);
我为什么要使用它?为什么这是一件好事?
哦,跨度太棒了!使用 span
...
意味着您可以使用该指针+长度/开始+结束指针组合,就像使用花哨的、拉皮条的标准库容器一样,例如:
means that you can work with that pointer+length / start+end pointer combination like you would with a fancy, pimped-out standard library container, e.g.:
for (auto& x : my_span) {/* do stuff *
本文标题为:什么是“跨度"?我什么时候应该使用一个?
基础教程推荐
- 如何在 C++ 中处理或避免堆栈溢出 2022-01-01
- C++ 标准:取消引用 NULL 指针以获取引用? 2021-01-01
- 您如何将 CreateThread 用于属于类成员的函数? 2021-01-01
- C++,'if' 表达式中的变量声明 2021-01-01
- 什么是T&&(双与号)在 C++11 中是什么意思? 2022-11-04
- 调用std::Package_TASK::Get_Future()时可能出现争用情况 2022-12-17
- C++ 程序在执行 std::string 分配时总是崩溃 2022-01-01
- 设计字符串本地化的最佳方法 2022-01-01
- 如何定义双括号/双迭代器运算符,类似于向量的向量? 2022-01-01
- 运算符重载的基本规则和习语是什么? 2022-10-31