似乎std::span
在 C++20 中的定义类似于
template<class T>
class span
{
T* begin;
size_t count;
};
并不是
template<class Iter>
class span
{
Iter begin;
Iter end;
};
哪个更通用(适用于 std::list、std::map 等)?
整个观点std::span<T>
是对连续数据的看法。pair<T*, size_>
(或类似的东西)是代表这种观点的正确方式。您不能拥有 a std::span
that 是 astd::list
或 a的视图std::map
,因此想出一种表示它的方法是没有意义的。关键是要成为一种常见的词汇类型,只接受连续的数据。
span
有效的类型擦除也很重要。Aspan<int>
可以指代在某处动态分配的 a 或 a 或 aint[20]
或vector<int>
a ......无论它来自何处,您只有一种类型:“查看一些连续的 s”。int[]
llvm::SmallVector<int>
int
确实pair<Iter, Iter>
(或更一般地说,pair<Iter, Sentinel>
)是一种更通用的表示形式,适用于更多容器。在 C++20 中也有这样的东西,叫做std::ranges::subrange<I, S>
. 但请注意,我们没有类型擦除方面...... a subrange
over amap<K, V>
将具有与 asubrange
在具有相同value_type
,like list<pair<K const, V>>
or vector<pair<K const, V>>
or or的不同容器上的不同类型multimap<K, V>
。