问题标签 [range-v3]

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 回答
859 浏览

c++ - 为什么范围的算法与 std 的迭代器不兼容?

该问题显示在上面的代码中。我使用range-v3-0.3.7

对我来说,通用算法copy不应该关心目标迭代器类型,只要它满足输出迭代器的要求。

如果是这样,为什么范围的算法与 std 的迭代器不兼容?

0 投票
2 回答
436 浏览

c++ - Range-v3 view::sliding(n) 返回元组(如果 n 在编译时已知)

range-v3 中是否有类似的视图可以返回一个元组?

就像是sliding<2>

0 投票
1 回答
228 浏览

c++ - 从容器创建一系列索引的最惯用的方法是什么?

有没有比做这样的事情更好的方法来迭代容器的索引

理想情况下看起来就像这样view::something(vec)

我知道我可以编写自己的函数来执行此操作,但想知道此功能是否已经存在。我也知道能够做这样的事情


经过一些代码检查后,我意识到可以改写这个view::indices(vec.size()),但是即使默认使用它产生的indices结果,我宁愿保留.ptrdiff_tsize()size_tptrdiff_t

0 投票
1 回答
80 浏览

c++ - 使用 range-v3 操作基础范围

我有一个数学图书馆。在这个库中,我有在单纯形空间中操作超平面的函数,以便我可以以各种方式对它们进行排序。

事实证明,这些超平面可以在不同的上下文中表示不同的事物。虽然数学是相同的,但在每种情况下,超平面意味着不同的事物,并且与不同的数据结构相关联。

能够编写代码来操作一次超平面,但允许它们处理不同的数据结构,这对我来说是有利的。

下面是一个简化的示例,试图解释我正在尝试做的事情:

这基本上是我的基础功能,这对于使用我的超平面的每个附加类(或者,在本例中为Math类)都是常见的。

现在在我图书馆的其他部分,我的类看起来像这样:

现在我需要能够应用foo到这些类的范围,并根据Math它们包含的属性重新排列它们。同时:

  • foo不知道Math每个类中的上下文名称。
  • foo不关心存在的其他元数据。

我想写的是这样的:

目前,我通过在取消引用时将boost::transform_iterators 传递给foo提取Math组件,并使用内部的自定义实现来执行此操作,该iter_swap内部实现foo能够知道它是否被传递了代理迭代器并始终交换底层原件。这达到了我想要的。

我很好奇这是否可以使用ranges-v3. const目前,如果我删除用于解包类的 lambda中的 s,则我能够编译此示例Something,但随后foo仅对 s 进行洗牌,Math而不将它们与其元数据保持在一起。

0 投票
2 回答
687 浏览

c++ - C++ range-v3 库:'take'-ing 前 3 个完美数字工作并停止;'take'-ing 前 4 不会在 4 之后停止

据我了解,range-v3 库的视图操作(目前需要 C++17,但要成为 C++20 中 STL 的官方部分)提供了可链接的类似 STL 的算法,这些算法是延迟评估的。作为一个实验,我创建了以下代码来评估前 4 个完美数字:

代码以可能的无限数字范围ranges::view::ints(1)开始ranges::view::take(3)( . 由于前三个完美数字 —— 6、28 和 496 —— 相当小,我希望这段代码能够快速找到它们,并打印“DONE”。并终止。这正是发生的事情:

coliru——取 3 个完美数字就可以了

但是,假设我想打印前 4 个完美数字,它们仍然很小—— 6、28、496 和 8128。打印 8128 后,程序并没有停止,最终不得不终止;大概它是徒劳地试图计算第五个完美数 33550336,这超出了这种蛮力算法有效找到的能力。

coliru -- 取 4 个完美数尝试取 5+

这对我来说似乎不一致。如果两个测试都失败了,我会理解的(结论是我误解了 range-v3 视图算法的惰性评估),但是 take(3) 成功并停止而 take(4) 对我来说似乎不是一个错误,除非我误解了事情。

我已经用 wandbox 上的几个编译器尝试过这个,它似乎是持久的(尝试过 clang 6.0.1 和 7.0.0,g++ 8.1.0 和 8.2.0)。至少在我最初发现问题的本地计算机上,使用的是 range-v3 的 0.3.6 版,但我不确定 coliru 和 wandbox。

魔杖盒链接

0 投票
1 回答
601 浏览

c++ - 为什么 `ranges::view::for_each` 要求函子必须返回 `InputRange` 概念的模型?

static_assert错误信息:

要使用 view::for_each,函数 F 必须返回 InputRange 概念的模型。

std::for_each接受一个返回的函子void,为什么ranges::view::for_each要求函子必须返回一个模型InputRange

0 投票
1 回答
813 浏览

c++ - view::join 是否需要可复制的内部范围?为什么?

假设我们有

所以我们可以很好地迭代内部范围

注意:range-for on ref 是必需的,因为cppcoro::generator不允许复制(已删除复制 ctor)

打印

但是当我们尝试用 view::join 来“扁平化”时

看来 view::join 需要可复制的内部范围?

是什么让它没有编译?

range-v3 或 cppcoro 中是否有任何错误?

只有不兼容的设计决策?

神螺栓(满)

0 投票
1 回答
138 浏览

c++ - 范围-v3 访问游标内部

在 c++ range-v3 库中。

是否可以访问游标(来自 view_facade)的内部数据?

如果没有 - range-v3 是否提供类似https://www.boost.org/doc/libs/1_68_0/libs/iterator/doc/iterator_facade.html的内容?

0 投票
1 回答
106 浏览

c++ - 如何将范围存储为类中的字段?

我想将一个范围存储为一个类中的一个字段,以便以后可以多次重复使用它。但是,与局部变量不同,我不能简单地将其类型指定为auto. 另一方面,库创建的范围类型非常复杂。手动找出正确的类型将花费我不成比例的长时间+如果我选择更改获取范围的方式,将来将无法维护。

所以,我想,也许我可以decltype用来帮助自己:

(注意:我的实际std::declval情况实际上更复杂,但我想让这个例子简短一些。)

但我收到一个错误: a lambda cannot appear in an unevaluated context

所以,我的问题是:

  • 如何避免使用 lambda 并开始decltype工作?
  • 或者也许有更好/更清洁的方法来获取范围类型以便将其声明为类中的字段?
0 投票
1 回答
156 浏览

c++ - 迭代容器或范围 - 常量问题

我正在尝试编写一个模板函数,它将汇总某个集合的所有元素 - 指定为普通的 stl 容器,或者指定为 range-v3 的范围。(实际功能,如下所示更通用)我认为这会起作用:

这确实适用于 STL 元素,但不适用于范围。这给了我一个很长的错误:

本来以为是ranges-v3的vs2015分支的一些不足。没有多想,我只是快速解决了一个问题:

但是随着最新的 MSVC 版本刚刚从预览版中出来,现在正式支持范围的主分支。然而,上述错误仍然存​​在。

  • 使用范围的对象const&是错误的吗?我知道这些对象是轻量级的并且很容易复制,但是使用 const 引用不应该受到伤害,或者?另一方面,如果传递了一个具体的 STL 容器,我需要将其传递为const&
  • 如果使用const&不正确,是否有一些简单的方法可以让函数同时使用容器和范围,而无需在调用站点编写任何内容(例如调用view::all

我正在使用 Visual Studio Community 2017,版本 15.9.3。请注意,在 15.9 之前,range-v3它的 master 分支不受支持。


既然你问我怎么称呼它。我的实际代码很复杂,但我将其简化为这个小例子:

这给了我与上面相同的转换错误。