问题标签 [boost-range]

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 投票
2 回答
1204 浏览

c++ - 提升 any_range 与“规范形式” - 后者是什么?

Boost 的any_range文档说明如下:

尽管底层any_iterator是最快的可用实现,但any_range由于实现增量、减量、提前、相等等所需的虚函数调用成本,性能开销仍然是可观的。通常更好的设计选择是转换为规范形式

作者所说的“规范形式”是什么意思?有人可以举个例子吗?

编辑: 正如这里所建议的,我在 boost 用户的邮件列表中提出了同样的问题。以下是本文原作者 Neil Groves 所说的:

例如,将范围复制到向量中。

是的,这正是我在编写文档时想到的替代设计。在 any_range 上进行迭代的开销相当大,并且通常与将具体结果类型复制到容器(例如向量)中相比较差。然而,情况并非总是如此,Boost.Range 的一些用户希望能够实现对 any_range 实例进行操作的算法。这有时是可取的,例如,允许从支持各种容器的共享库中公开算法。使用 any_range 也可能适用于范围内的通过次数很少,但底层容器的内存大小非常大的情况。

在许多情况下,性能开销无关紧要。我想确保我没有误导任何人广泛采用 any_range 用法。我相信这个类的有效用法很少,但有时它正是正确的设计选择。我将在适当的时候通过一些额外的说明和示例来改进文档。

0 投票
1 回答
1450 浏览

c++ - 使用 boost::range 在 C++ 中进行花式索引

我想使用 boost::range 来实现类似于 NumPy 和 Matlab 中可用的“花式索引”的东西。具体来说,我想使用另一个容器的元素作为索引来选择一个可索引容器的某些元素。例如,可以在 Python 中执行以下操作:

在 C++ 中,使用 boost::range,我认为上面的代码看起来像这样:

由于现有范围适配器(boost::adaptor::indexed)已经使用了名称“indexed”,因此我在上面的代码中将尚未实现的索引适配器称为“sampled”。

有谁知道这样的适配器是否已经存在于某个地方的 boost 中,或者是否有他们愿意分享的实现?我已经开始尝试自己实现它,首先编写一个“sampled_iterator”(使用 iterator_adaptor),然后编写一个“sampled_range”(使用 iterator_range),但我发现它非常棘手。

0 投票
5 回答
378 浏览

c++ - 创建输出存储而不是应用于现有存储的 C++ 算法?

C++ std 算法定义了许多算法,它们接受输入和输出序列,并根据输入序列的元素创建输出序列的元素。(最好的例子是std::transform。)

std 算法显然采用iterators,因此毫无疑问,在OutputIterator调用算法之前,容器必须存在。

那是:

就 std 库而言,这很好。当我发现迭代器太麻烦时,我经常使用Boost.Range来简化事情。

然而,在这种情况下,Boost.Range 中的变异算法似乎 使用OutputIterators.

所以我目前想知道那里是否有任何方便的库,可以让我写:

- 如果没有,是否有理由没有

编辑:示例实现(不确定这是否适用于所有情况,以及这是否是最理想的):

(注意:我认为convenient::transform与手写的具有相同的性能特征,因为返回的向量不会因 (N)RVO 而被复制。无论如何,我认为性能对于这个问题是次要的。)


编辑/注意:到目前为止给出的答案(评论,真的)中,大卫给出了一个非常好的基本通用示例。

Luc 提到std::back_inserterwrt可能存在的问题。通用性。

两者都只是说明为什么我犹豫要自己动手,以及为什么“适当的”(经过适当测试的)库比自己编写代码更可取。

我上面用粗体字表示的问题,即是否有一个,或者是否有理由没有,基本上没有得到回答。

0 投票
2 回答
101 浏览

c++ - 在函数内加载命名空间符号以进行模板实例化

我写了一个模板化的operator+=函数,并给了它一个独特的命名空间(我只想有时使用它,这让我可以明确地使用它)。

然后我想在另一个在其操作数上使用的模板函数中使用operator+=函数,但我不想让它在符号表中徘徊,等待+=我在程序中的任何位置执行的每一个调用。我还必须在广泛包含的标题中执行此操作。

一个基本的例子是:

有没有办法达到这个结果?

0 投票
1 回答
1743 浏览

c++ - 如何创建一个 Boost.Range 隐藏多层向量并将其公开为单个 Range?

我有一个无法修改的遗留类层次结构。由于外部库的要求,我需要为 Line 和 Ring 定义 Boost.Ranges,它们都只在一次运行中暴露点(即,对于 Line 和 Ring,它应该是 Boost.Range 的点) .

伪代码来说明:

这条线很简单,因为点是直接存储的(我已经使用 Boost.Range 成功完成了此操作,请参见示例)。但是,我不知道如何使用 Ring 来执行此操作,因为我需要直接到达每条线路的点。

0 投票
1 回答
4057 浏览

c++ - 结合提升范围算法,例如。boost::copy 和 boost::remove_if

我正在尝试编写一个复杂的算法列表,这些算法必须应用于范围序列。我想使用类似于以下代码的语法嵌套许多算法。我唯一的问题是它不会编译。有什么建议么?

为了使这种语法起作用,我不想为内部算法指定模板参数。这可以通过使用 auto 关键字来简化,但我需要保持代码向后兼容。

这是错误消息的片段:

0 投票
2 回答
947 浏览

c++ - cout a boost::range of elements

Boost Ranges 是否有内置方法来轻松计算元素,例如用逗号或空格分隔?

我当然知道我可以遍历它们并分别打印它们,但在我看来,这应该以某种方式内置(比如用脚本语言打印矢量)。

在我看到的一个示例程序中,作者将范围复制到 cout:

boost::copy(范围, ostream_iterator(cout, " "))

在我看来很难看。这是惯用语吗?

编辑: std 迭代器的解决方案也是可以接受的。

EDIT2:我想做的是:

但我认为这行不通。所以我希望是这样的(受 Python 启发):

或者可能使用范围适配器。

0 投票
1 回答
2453 浏览

c++ - 将 std::pair 迭代器转换为 boost::iterator_range

我有一个std::multimap,我想创建一个boost::iterator_rangefrom equal_range。我在文档中发现没有简单的方法,所以我尝试了以下方法:

令人惊讶的是,它可以工作(使用 GCC 4.1.2)。我很好奇它是如何工作的。我发现iterator_range构造函数没有重载可以做到这一点,并且multimap::iterator_range显然没有重载会返回 Boost 范围。

0 投票
1 回答
4294 浏览

c++ - 如何返回 iterator_range

我想创建并保留一个 iterator_range。范围是基于谓词构造的(对于本示例,我查找偶数)。

我可以这样做,但似乎我必须从正在迭代的底层向量中复制元素。

请在下面的示例中查找标记为“>>>”的注释。

有没有办法创建 iterator_range 而不必从原始向量创建条目的副本?

我看过,但还没有看到这种特殊情况的答案。

0 投票
1 回答
1104 浏览

c++ - 如何使用 boost::joined_range 实现范围适配器

以下是基于实现带参数的范围适配器的范围适配器示例:

输出

1 2 3

我想调整以上内容以使用boost::joined_range。换句话说,取两个向量,然后将它们连接到 内的一个更长的范围内permutation_range。这个想法很简单:

将输出的示例2 4 6

到目前为止,我所有的尝试都以大量编译器错误而告终,我没有展示这些尝试,因为我可能会走得很远。我不知道这是否可能,但是有人可以在这里帮助我吗?

最终编辑(在基类之前初始化范围的解决方案)