420得票4回答
什么是“span”,在什么情况下应该使用它?

最近我得到了建议在我的代码中使用 span<T>,或者在这个网站上看到了一些使用 span 的答案 - 据说是某种容器。但是 - 我在 C++17 标准库中找不到类似的东西。 那么这个神秘的 span<T> 是什么,为什么(或何时)使用它是一个好主意,如果它是非标准的呢?

21得票1回答
为什么std::span缺少比较运算符?

std::span不是设计为轻量级引用std::vector/std::array/普通数组等的子区域吗?它的API中难道不应该包含比较运算符,以与它们保持一致吗?排除这些运算符背后的原因是什么?注:这里的比较运算符指的是完整集合(<、<=等)或者太空船运算符<=>

21得票2回答
跨度是否传播const?

标准容器传递const。也就是说,如果容器本身是const,它们的元素将自动成为const。例如:const std::vector vec{3, 1, 4, 1, 5, 9, 2, 6}; ranges::fill(vec, 314); // impossible const std::l...

16得票1回答
为什么span的数组和std::array的构造函数与其容器构造函数不同?

我一直在使用clang trunk和libc ++在Godbolt上尝试最新版本的 std::span 规范,并发现其中一些构造函数令人困惑。 特别是,我发现来自普通数组和std :: array 的构造函数与其他容器不同。 例如,以下代码似乎可以编译:std::vector<int...

16得票1回答
C++允许在一个span是另一个span的子span时进行std::span::iterators之间的比较吗?

一般来说,C++不允许比较不同容器之间的迭代器。例如: int main() { std::vector<int> v = {1, 2, 3}; std::vector<int> w = {4, 5, 6}; std::cout << v.en...

14得票1回答
为什么std::span缺少cbegin和cend方法?

为什么std::span只有begin和end方法,而没有它们的常量迭代器对应物cbegin和cend?(标准) 我注意到的是,我能找到的关于span的提案确实定义了cbegin和cend:P0122R7。为什么会被删除?

12得票3回答
为什么我在函数中更倾向于传递 std::span 而不是 std::vector&?

我知道这可能与问题“什么是“span”,何时应该使用它?”有重叠,但我认为对于问题的这个特定部分的答案相当令人困惑。一方面,有这样的引用: 如果你有一个你知道适合你的代码的标准库容器(或者Boost容器等),就不要使用它。它不打算取代它们中的任何一个。 但在同一个答案中,出现了这样的陈...

11得票2回答
将 std::span 分配给 std::vector 的最简单方法

我想要做这件事 #include <vector> #include <span> struct S { std::vector<int> v; void set(std::span<int> _v) { ...

11得票1回答
返回条件性的`range_expression`

根据某些条件,迭代已知范围中的一个最有效的方法是什么? 二进制条件的伪代码: for element in (condition ? range_a : range_b) // do work 这个“示例”展示了我使用基于范围的for循环的意图,但由于std::initialize...

10得票1回答
为什么std::span是一个指针+大小而不是两个迭代器?

看起来 C++20 中的 std::span 定义类似于 template<class T> class span { T* begin; size_t count; }; 而不是template<class Iter> cla...