问题标签 [boost-iterators]

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

c++ - 使用boost迭代器针对map的每个键在值容器的每个元素上实现迭代器

如何使用 boost::iterator_adaptor 仅在 map/unordered_map 的值上实现迭代器?我尝试过以下代码,但由于注释行,它不起作用。 有没有办法避免这个问题?

这里的问题与 boost 代码中显示的 map_values 适配器示例略有不同,因为这里的 map 中的 value 字段是另一个容器,如列表或向量,这里的要求是针对地图的每个键迭代这些列表的所有元素。迭代器的 deref 是那些列表/向量的 value_type 类型。迭代器的结尾是最后一个键的列表的结尾

0 投票
1 回答
341 浏览

c++ - 如何使用正则表达式标记和转换 c 字符串并提升转换迭代器?

我尝试用分号分隔的数字标记一个 c 字符串并将它们存储在一个向量中。这是我的简化方法

我收到错误消息:

我不明白。

0 投票
2 回答
1423 浏览

c++ - 将具有指针值类型的 unordered_map 上的迭代器转换为具有 const 引用值类型的同一映射上的迭代器

我有以下课程:

如您所见,我希望此类用户_children能够在无法修改它们的情况下迭代元素。这就是为什么我想创建一个指向 type 元素pair<char, const Node&>而不是pair<char, ptr_type>.

对于手头的任务来说,创建一个基迭代器类似乎有点太复杂了。我看过 boost iterator,我认为transform_iterator可能是要走的路,但我还没有找到如何让它工作。

当我在这里时,有谁知道我在哪里可以找到定义的迭代器的不同示例的示例boost-iterators?每种类型的文档中只有一个示例,它们并不总是符合我的需求(我是这个库的新手,我可能错过了一些明显的东西)。

更新:这是我尝试使用boost::transform_iterator

不幸的是,它没有编译,并给出以下错误:

0 投票
3 回答
434 浏览

c++ - 如何使自定义容器类型适应 BOOST_FOREACH?

我想BOOST_FOREACH在我的代码库中使用一种无​​法更改的旧容器类型。

我在该类型上定义了以下方法:

  • .length()返回容器中当前元素的数量
  • .operator[](unsigned i)返回对索引下元素的引用i

我知道我需要让我的容器类型满足单程范围概念,正如 boost 文档所建议的那样,但由于我无法修改类型,我不知何故迷失了方向。

任何提示/解决方案都会很有用。

编辑

我试图提出建议,但这段代码

给我以下编译器错误:

0 投票
0 回答
172 浏览

c++ - 如何为 Windows 注册表枚举实现前向遍历迭代器

我能够使用Boost Iterator Facade构建一个自定义的 Single Pass Iterator来迭代(以 C++ 方式)包含在 Windows 注册表项中的值,包装 C API RegEnumValue

例如:

基本上,迭代器的increment方法调用RegEnumValue增加dwIndex参数(最初在迭代器类构造函数中设置为0),当ERROR_NO_MORE_ITEMS返回时,即映射到“结束”迭代器。

我用过boost::single_pass_traversal_tag

Boost.Filesystemdirectory_iteratorAPI包装在 Windows 实现中,也被实现为单遍迭代器。同样, the也是一个输入迭代器不是前向迭代器)。FindNextFilestd::experimental::filesystem::directory_iterator

那么,注册表枚举是否有可能将迭代器类别升级为前向遍历迭代器?我应该遵循哪些步骤来实现该目标?

换句话说,是否有可能使用 Windows 注册表 API 来实现前向遍历迭代器所需的多遍RegEnumValue遍历?如果是这样,怎么做?


PS我已经讨论过注册表枚举/迭代,但是使用API枚举/迭代注册表的情况也非常相似。RegEnumKeyEx

0 投票
1 回答
212 浏览

c++ - 使用 openMP v. 2.0 并行化过滤器迭代器

我有一个大向量。我只想并行增加积极的成员。

结果是错误的!

然而,我试图解决的真正问题比这个更复杂。我试图简化我的问题,以便更容易理解。我还必须提到,我只能使用 openMP v.2.0。这就是为什么我尝试拆分我的向量并将向量的每个部分专用于特定线程的原因。

任何想法将不胜感激。

0 投票
1 回答
171 浏览

c++ - 根据 boost::iterator_facade 定义一个基于代理的 OutputIterator

我编写了这个 C++17 代码,并希望它能开箱即用。

我试图通过设置我的迭代器的成员 typedefsvalue_typereferenceto来匹配所有标准 OutputIterators 的行为void(因为这些类型对于operator*不返回引用的迭代器来说毫无意义)。

然而,Boost 抱怨:

看起来 Boost 正在尝试将生成operator*的签名硬编码为reference operator*() const. 也就是说,boost::iterator_facade 可以operator*()通过简单地传递 ; 返回的任何内容来推断出正确的返回类型dereference()。但由于某种原因,它只是不配合。

解决方案是什么?我不能proxy作为基类的模板参数传递,因为proxy尚未定义。我可以拉出proxy一个详细的命名空间:

但这似乎很尴尬,绝对是“不必要的”。

这是一个错误iterator_facade吗?它是功能而不是错误吗?如果是后者,那么我应该如何使用它来创建 OutputIterators?

另外,一个小问题:即使我使用 detail 命名空间的解决方法也是“错误的”,因为std::is_same_v<putc_iterator::reference, detail::proxy>当我想要的(与标准迭代器相同)是std::is_same_v<putc_iterator::reference, void>.

0 投票
1 回答
228 浏览

c++ - 使用 boost::iterator_adapter 实现自定义迭代器时,我可以对可变迭代器和 const 迭代器使用相同的类吗?

我有一个拥有 a并且std::vector应该提供begin()end()和方法的类。由于我不想公开实现细节,即我使用 a ,所以我必须有自己的迭代器。据我了解,这是为了:它需要一些迭代器并将其包装在一个新的迭代器类型中 -> my变成 then 。cbegin()cend()std::vectorboost::iterator_adapterstd::vector<T>::iteratorMyClass::iterator

首先,我对 boost::iterator_adapter 的理解是否正确,其次我可以避免编写第二个 const_iterator 而是例如 typedef it ( using const_iterator = const iterator)?

这可能无法编译。

0 投票
2 回答
2122 浏览

c++ - 通过使用 boost 属性树解析 JSON 文件来访问布尔值

以下是我从 JSON 文件中获取值的步骤:

我无法获取布尔值。

在下面的代码中,我是:

  1. 打开 JSON 文件
  2. 设置根元素并开始遍历该根元素下的子树(Bases)
  3. 获取每个标签的值并将它们保存到适当的变量类型。

代码:

错误:

错误:无法在赋值中将 'std::basic_string<char, std::char_traits<char>, std::allocator<char> >' 转换为 'bool'

显然,布尔值"relay":true被视为字符串而不是bool.

如果我改变

代码工作正常,但bool类型无法编译。

我错过了什么吗?

0 投票
0 回答
76 浏览

c++ - 为什么转换迭代器不实现operator->?

虽然像这样的转换迭代器实现boost::transform_iterator肯定很有用,但我发现的所有实现似乎都有一个共同的弱点:它们只提供operator*,而没有operator->

给定一个返回引用的转换函数,实现起来operator->很简单。

给定一个按值返回的转换函数,operator->使用代理实现也应该不是问题。

为什么认为最好只提供一个operator*,而不提供operator->?这里使用代理与例如有什么不同std::vector<bool>吗?

更新:这是一个非常简单的概念证明,用于演示这样的代理对象如何工作(针对std::string类型进行硬编码):

在 Ideone 上运行