最近我得到了一些建议,span<T>
在我的代码中使用了's',或者在网站上看到了一些使用span
' - 据说是某种容器'的答案。但是 - 我在C ++标准库中找不到那样的东西。
那么,这是什么神秘的span<T>
,为什么(或什么时候)使用它是一个好主意,如果它不是标准的?
发布于 2018-04-17 15:19:28
A span<T>
是:
struct { T * const ptr; size_t length; }
一堆便利方法。它以前被称为一个array_view
,甚至更早array_ref
。
首先,何时不使用它:
std::sort
,std::find_if
,std::copy
和所有的超级通用模板功能。现在什么时候才能真正使用它:
span<T>
分别使用(分别span<const T>
),而不是一个独立的T*
(分别const T*
),你有长度值。所以,替换功能如下:void read_into(int* buffer, int buffer_size);
有:void read_into(span<int> buffer);
哦,跨度真棒!使用span
...
for (auto& x : my_span) { /* do stuff */ }
std::find_if(my_span.begin(), my_span.end(), some_predicate);
......但是绝大多数的容器类别都没有发生。
int buffer[BUFFER_SIZE]; read_into(buffer, BUFFER_SIZE);
变成这样:
int buffer[BUFFER_SIZE]; read_into(buffer);
...这将做你想做的事情。另见准则P.5。const vector<T>&
当你期望你的数据在内存中连续时传递给函数的合理的选择。没有更多的人被强大的C ++大师所诟病。span
,方法将在#ifndef NDEBUG
...中有一些边界检查代码#endif
)使用span
s的动机更大,你可以在C ++核心指南中找到它- 但你可以发现漂移。
它是核心指南的支持库(GSL)的一部分。实现:
gsl/span
span<T>
。https://stackoverflow.com/questions/-100004423
复制相似问题