似乎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::spanthat 是 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 subrangeover amap<K, V>将具有与 asubrange在具有相同value_type,like list<pair<K const, V>>or vector<pair<K const, V>>or or的不同容器上的不同类型multimap<K, V>。