9

似乎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 等)?

4

1 回答 1

13

整个观点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>

于 2019-06-28T18:07:43.440 回答