最近我得到了建议在我的代码中使用 span<T>,或者在这个网站上看到了一些使用 span 的答案 - 据说是某种容器。但是 - 我在 C++17 标准库中找不到类似的东西。 那么这个神秘的 span<T> 是什么,为什么(或何时)使用它是一个好主意,如果它是非标准的呢?
std::span不是设计为轻量级引用std::vector/std::array/普通数组等的子区域吗?它的API中难道不应该包含比较运算符,以与它们保持一致吗?排除这些运算符背后的原因是什么?注:这里的比较运算符指的是完整集合(<、<=等)或者太空船运算符<=>
标准容器传递const。也就是说,如果容器本身是const,它们的元素将自动成为const。例如:const std::vector vec{3, 1, 4, 1, 5, 9, 2, 6}; ranges::fill(vec, 314); // impossible const std::l...
我一直在使用clang trunk和libc ++在Godbolt上尝试最新版本的 std::span 规范,并发现其中一些构造函数令人困惑。 特别是,我发现来自普通数组和std :: array 的构造函数与其他容器不同。 例如,以下代码似乎可以编译:std::vector<int...
一般来说,C++不允许比较不同容器之间的迭代器。例如: int main() { std::vector<int> v = {1, 2, 3}; std::vector<int> w = {4, 5, 6}; std::cout << v.en...
为什么std::span只有begin和end方法,而没有它们的常量迭代器对应物cbegin和cend?(标准) 我注意到的是,我能找到的关于span的提案确实定义了cbegin和cend:P0122R7。为什么会被删除?
我知道这可能与问题“什么是“span”,何时应该使用它?”有重叠,但我认为对于问题的这个特定部分的答案相当令人困惑。一方面,有这样的引用: 如果你有一个你知道适合你的代码的标准库容器(或者Boost容器等),就不要使用它。它不打算取代它们中的任何一个。 但在同一个答案中,出现了这样的陈...
我想要做这件事 #include <vector> #include <span> struct S { std::vector<int> v; void set(std::span<int> _v) { ...
看起来 C++20 中的 std::span 定义类似于 template<class T> class span { T* begin; size_t count; }; 而不是template<class Iter> cla...