问题标签 [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 回答
423 浏览

c++ - 你如何声明一个 range-v3 视图返回值?

目前,我可以像这样编写 range-v3 视图:

但是如果我想从函数中返回 v,我需要知道它的类型。range-v3 视图的类型是什么?

0 投票
1 回答
287 浏览

c++ - 如何将 C++ range-v3 输出到 ostringstream?

此 range-v3 示例无法使用 Visual C++ 15.9 版进行编译:

这是设计使然吗?输出范围的方法是什么ostringstream

0 投票
1 回答
135 浏览

c++ - 显式 range-v3 decltype 评估为无效?

我正在尝试获取范围的显式类型(将来我可能希望将其作为字段存储在类中)。但是,由于某种原因,它评估为void?

使用 g++ -std=c++17 编译时,它给出

(g++ 版本 g++ (Ubuntu 7.3.0-27ubuntu1~18.04) 7.3.0)

我在 Visual Studio 2017 v. 15.9 上遇到类似错误


这个问题是我的另一个问题的延续:如何将范围存储为类中的字段?但更具体,我相信它应该分开。

0 投票
1 回答
546 浏览

c++ - 如何隐藏 range-v3 的复杂范围类型?

我需要一个具有使用 range-v3 库返回某种范围的方法的类。为了实现这样一个类,我可以在该类的定义中正确编写它。例如:

但是,在我的真实案例中,该Foo::r功能非常复杂,我想隐藏它的实现。特别是,实现使用了一些额外的库,否则在声明类时不需要包含这些库Foo

但是,当 的定义Foo::r与其声明分开时,必须明确指定其返回类型。decltype附带一些帮助

头文件:

实现,cpp文件:

这直接完成了隐藏Foo::r. 但是,返回值的类型仍然有效地“泄漏”了有关如何构造范围的信息。可能更糟糕的是,我现在被迫std::function在范围管道中显式使用一个对象。

但是,返回范围的用户是否真的需要所有信息?所有Foo::r关心的用户是它是某种可迭代的。它有:

  • begin()给范围的开头一个迭代器
  • end()给一些迭代器或哨兵
  • 迭代器可以递增,以迭代范围
  • 可以取消引用迭代器,给出某种类型TBeta*在示例中)。

用户不关心是否存在转换视图,也不关心转换、过滤器等的数量。

所以,我的问题是——有没有办法隐藏所有这些信息?我希望能够写出这样的东西:

在标题中:

在 cpp 文件中:

我可以接受这样一个事实,即生成的Iterable类型可能包含由于隐藏过程而无法内联的真实函数调用。链接时优化可能会也可能不会在以后对其进行优化。

不幸的是,据我所知,这Iterable只是一个概念,而不是库中的一个单独类型。

0 投票
3 回答
145 浏览

c++ - 按非惰性 lambda 表达式/投影排序

我有某种类型的元素数组T。对于一些复杂的函数在此处输入图像描述,我想按该函数的值对数组进行排序。有效率的。

当我对如何做这样的事情进行一些研究时,我很快发现 range::v3::sort,从 range-v3 库中,可以在projections的帮助下使用。在这种情况下,T可以将该值投影到比较器使用的新值上。问题是,它是懒惰地完成的。

考虑以下示例:

为简洁起见,此处保持T简单。f这给了我输出:

但设想这f是一些我不想重复执行的复杂功能,每次在比较器中使用它(否则我可以编写一个自定义比较器并使用常规std::sort)。我希望f每个值都只被调用一次。但是,一旦对数组进行了排序,f就可以丢弃 的结果。

此外,它们自身的真实价值T也相对复杂。我可以快速交换两个元素,但我不应该将它们复制到一个新的临时容器(例如std::vector<std::pair<T,int>>)中进行排序。

除了手动排序我的输入数组之外,还有一些简单的方法吗?

0 投票
0 回答
93 浏览

c++ - range-v3:静态断言失败:无法查看临时容器

我正在学习 range-v3 库,并且在编译以下代码时遇到问题:

g++ 说:

我已经尝试过 g++7 和 8 以及 clang 6。他们都说了类似的话。我的理解是问题出在第 39 行,我将临时返回。

我的目标是一次只计算一个渲染并将它们一一添加到总和中。显然这不适用于上面的代码。是否有可能使用范围库来制定它以及如何制定?

0 投票
1 回答
228 浏览

c++ - 如何使用 range-v3 库从 std::vector 获取列视图和行视图?

将 7x5 矩阵展平为 std::vector,我想使用 Eric Niebler 的 range-v3 库查看列和行。到目前为止,我设法(改进空间)获得了单行、单列和连接行的视图。

请参阅:https ://wandbox.org/permlink/8o4RgSucF3zSNuPN

但是我怎样才能快速了解:

  1. 行列表:

    auto a = numbers | GetRows({2,3,5}, n);

  2. 连接的列:

    auto b = numbers | GetCols(2, 4, n);

  3. 列列表:

    auto c = numbers | GetCols({1,2,4}, n);

  4. 行列表(“未排序”):

    auto d = numbers | GetRows({5,2,3}, n);

  5. 列列表(“未排序”):

    auto e = numbers | GetCols({4,1,2}, n);

?

0 投票
2 回答
377 浏览

c++ - c++ 提升范围。数组中的对数组

我有一个 C 整数数组及其大小,即int* arr, unsigned size. 我想从中获得类似的视图,它将具有成对的整数作为元素。

澄清一下,任务是:我收到一个类似的数组[1,2,3,4],我想要一个视图,这将是 smth like [(1,2),(3,4)]

是否有任何便捷的方法可以通过 boost 或 std 范围以这种方式转换数组?

0 投票
0 回答
78 浏览

c++ - range-v3 的 meta::defer 的实现是如何工作的?

这里是实现meta::defer

detail::defer_

detail::try_defer

struct id

struct nil_ {};

官方文档(示例用例)

一个包装器,它使用 lambda 或 let 表达式中的类型参数 Ts 延迟模板 C 的实例化。

在下面的代码中,理想情况下 lambda 将被写为 lambda<_a,_b,push_back<_a,_b>>,但是这会失败,因为 push_back 期望它的第一个参数是一个列表,而不是一个占位符。相反,我们使用 defer 来表达它,如下所示:

根据用例,meta::defer似乎将表达式推迟到 SFINAE 工作。但我无法弄清楚实现是如何工作的。

问题

1.如何meta::defer工作?

2. libcxx 还有一个struct __dependent_type,其定义为:

我还问了一个问题__dependent_type(为避免重复,我不在__dependent_type这里放细节)

如果meta::defer只是推迟 SFINAE 的表达式,是否可以将其替换为__dependent_type上面的,为什么?

0 投票
1 回答
229 浏览

c++ - 为什么 range-v3 库中缺少 interleave_view?

在 Eric Niebler 的 range-v3 日历示例中,他使用 interleave 后跟 chunk 来转置矩阵。

我想知道为什么交错不是 range-v3 库的一部分...