问题标签 [std-span]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
227 浏览

c++ - 为什么 C++20 知道如何散列 string_view,但不知道如何散列 span?

我最好的猜测是,委员会要么忘记了这个用例,要么不想使用概念/要求将span类型限制为可以安全散列的东西(POD,无填充),或者他们不想要一半的解决方案(等待反射)...

如果有人对这里感兴趣,godbolt链接带有无用的错误消息和代码,但我认为我的问题很清楚,没有任何代码。

注意:我知道在散列方面缺少 C++std::库,例如它不能散列std::pair<int,int>,但我的问题特别是关于std::span.

0 投票
1 回答
108 浏览

c++ - std::span 迭代器可以比创建它们的 span 对象更长寿吗?

换句话说,std::span在 span 实例被销毁后,迭代器是否失效?

我有一个需要用不同布局迭代的向量。我试图std::span避免编写大量迭代器样板文件或引入外部库依赖项。简化示例:

https://godbolt.org/z/n1djETane

0 投票
1 回答
89 浏览

c++ - 无法满足 C++ 范围要求自定义容器

我一直在尝试编写一个带有自己的迭代器的自定义容器,它可以用作范围和带有std::span. 我是新手,所以请善待。

以下示例无法编译,因为我的容器类无法转换为 std::span

抱歉,这是一个很长的最小示例,但我的理解是自定义迭代器需要提供所有适当的功能才能使用std::span.

我从 clang 得到的编译错误是

或者来自 VS2019

Clang 最初给我的错误是关于不满足所有各种范围类型的要求,包括输入和输出范围,它指的是 _Begin。但是当我将代码剥离回这个例子时,消息变得不那么详细了。

这让我认为我的迭代器有问题。如果不是返回我的自定义迭代器,而是返回一个原始指针,那么代码编译得很好。

有没有办法弄清楚为什么我的代码不起作用?我什至都在努力寻找一个合适的指南,这对于那些刚接触范围的人来说是可以理解的。

0 投票
1 回答
183 浏览

c++ - 如何使类与采用范围的 std::span 构造函数兼容?

我希望能够将我的自定义容器传递给这个std::span构造函数:

我需要向我的自定义类添加什么以使其满足能够将其传递给std::span接收范围的构造函数的要求?

例如,std::vector我们能够做到这一点:

我已经将这些添加到我的自定义类中:

...这反过来又允许我使用基于范围的循环,std::data(my_container)以及std::size(my_container). 我错过了什么,以便我也可以将我的容器传递给std::span构造函数?是否需要实现更复杂的迭代器?

0 投票
2 回答
69 浏览

c++ - 在 push_back 被称为未定义行为之后,将 std::span 用于 std::vector

我的理解std::span是它本质上包含指向容器的指针、大小和一些有用的成员函数。

如this question所示,我可以采用一个向量的跨度。

如果我将条目添加到向量的末尾,则可能需要调整向量的大小。调整矢量大小时,会发生以下步骤(顺序不重要)。

  1. 在具有更多空间的堆上分配了一个新数组。

  2. 向量中的条目被移动到新数组中。

  3. 到's 数组ptr的成员更改为新数组的开头。vectorvector

  4. 旧数组被释放。

span如果vector' 的数组需要重新分配并变大,会发生什么情况吗?是否在未定义的行为上调用了spaninto a vectorafter ?push_backvector

0 投票
1 回答
93 浏览

c++ - 是否有传递向量的通用模式作为跨度?

我认为不需要分配一个缓冲区来保存 string_views 的跨度。所以可能是中间人std::vector<std::string_view>?有什么好的整体模式可以将其压缩到 1 行吗?如有必要,哪种助手/实用程序最好?

0 投票
1 回答
115 浏览

c++ - 在哪里使用 std::span?

我想编写一个可以从其调用站点接受任何类型的连续缓冲区(例如,原始数组等)std::array函数std::vector。我想出了两种方法。

方法#1:

这里,expectedTokenCount是将插入到buffer.

方法#2:

在这种方法中,我认为我最好以一种首先检查通buffer孔大小buffer.size( )并与之比较expectedTokenCount以确保其容量大于或等于的方式编写函数,expectedTokenCount否则会引发某种异常。这是比第一种方法更有效且更安全的方法吗?哪一个更好?如果将向量传递给它,它的行为span及其成员函数会改变还是与数组相同?size

0 投票
1 回答
97 浏览

c++ - 如何传递一个空的 span 对象?

有没有办法将空std::span<int>传递给函数?

我有如下功能:

而且我想将其更改为使用std::span而不是,std::vector以便它也可以获取std::array原始数组作为其参数。

现在在这里:

是否也std::span正确支持所有连续的容器(例如std::vectorstd::array等)?

0 投票
1 回答
123 浏览

c++ - std::span 是视图吗?

std::span视图吗?

我的猜测源于它不“拥有”的事实。

我读过它是对范围的引用,并且它“只是包装”我没有看到任何地方明确说明它是一个视图。

0 投票
1 回答
51 浏览

c++ - 如何初始化 std::span? 常量问题

我正在尝试初始化一个span<const T*>- 即指向 const 数据的指针列表。但是,const指针和span<>可用构造函数之间的转换规则阻碍了我。

我确定有办法做到这一点,但我找不到正确的转换/调用。

旁白:我实际上没有使用 C++20,而是tcb::span,它使用较旧的P0122R7构造函数集,带有 (pointer,size) 而不是迭代器。但我怀疑在 C++20 上工作会让我朝着正确的方向前进。

下面的示例演示了我正在尝试做的事情,以及一些修复它的失败尝试:

Godbolt上的实时链接

有任何想法吗?