问题标签 [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.
c++ - 使用 `std::equal_range` 和 `boost::transform_iterator`
假设我有一个Item
s 结构,我将其存储在 an 中std::set
并进行如下排序:
我想用std::equal_range
搜索ItemSet
,但我想搜索Position
。我知道我可以做类似的事情:
但我想避免暂时的Item
。
我试着boost::transform_terator
像这样使用:
但这由于我不明白的原因无法编译,而且即使它确实有效,我如何将迭代器从原始集合中获取result
?或者也许有更好的方法来做到这一点?
这是一个测试工具显示问题:http ://cpp.sh/3hzsq
任何帮助,将不胜感激!
c++ - 在 std::unique_ptr 的向量上使用 make_transform_iterator 来获取 const 指针
我想创建一个包含数据结构的 unique_ptr 向量的类,并且可以作为指向数据结构的 const 指针进行迭代。
我尝试了这段代码但没有成功:
我还尝试使用包装在 get_value 函数中的 lambda,但没有取得更多成功:
我在这两种情况下都得到相同的编译错误,但我不太了解它们。为什么它不编译,以及如何纠正它呢?
编辑:添加编译错误:
c++ - boost::reverse_iterator 是否有 C++11 替代品?
我有一个在 C++03 上运行的应用程序,它使用了 boost::reverse_iterator。我终于能够升级到 C++11 编译器,并且我注意到 boost/iterator/reverse_iterator.hpp 不再安装(我使用的是 Boost 1.74.0)。
我认为这是因为 C++11 的 std::reverse_iterator 取代了它。是这样吗?
我尝试使用 std::reverse_iterator 代替 boost::reverse_iterator,但它对我不起作用。原因是我的基本迭代器,虽然它是随机访问的,但不是真正的 STL“随机访问迭代器”,因为它的引用类型是代理,而不是真正的引用。当我使用 std::reverse_iterator 时,它会尝试获取我的“参考”地址。
是否有 C++11 替代 boost::reverse_iterator,或者我需要从头开始为我的应用程序编写一个?
编辑:对不起 - 你是对的 boost::reverse_iterator 在 boost 1.74.0 中仍然存在。我的包含路径有问题,我错过了。
如果我使用 boost::reverse_iterator,一切都对我有用。
如果 std::reverse_iterator 应该与代理引用类型一起使用,那么我很好奇为什么代码不起作用。更准确地说,我可以看到它失败的原因,但在我看来 std::reverse_iterator 似乎并不完全支持代理类型。
特别是,std::reverse_iterator 的 operator->() 不适用于代理类型。该运算符需要返回一个指向值类型的指针。它试图通过取消引用迭代器然后获取它获得的值的地址来做到这一点。在这种情况下,取消引用迭代器会返回一个代理,而不是一个引用,并且获取它的地址是获取一个右值的地址,这会在 g++ 8.3.1 中生成此错误:
如果我使用 std::reverse_iterator 并用 (*i). 替换 i-> 的实例,那么它可以工作,但这不是迭代器的行为方式。
我的迭代器(MyIteratorType)是使用 boost::iterator_adaptor 构建的,并且该文档说他们使用未指定的技巧来让 operator-> 为代理类型工作。看起来 boost::reverse_iterator 在基本迭代器的版本之上构建了它的 operator->,所以它利用了这些技巧,但 std::reverse_iterator 没有。
如果有人知道更多细节,我会很感兴趣!
c++ - 如何将单个对象转换为 boost::any_range?
我正在尝试创建并返回一个 boost:any_range 只包含一个对象(我不知道这是否是核心问题),但我收到以下错误:
- 错误 C2893:无法专门化函数模板 'range_iterator<C,void>::type boost::range_adl_barrier::begin(T &)'
- 注意:使用以下模板参数:
- 注意:'T=const WrappedRange'
- 错误 C2672:“结束”:未找到匹配的重载函数
- 错误 C2893:无法专门化函数模板
'range_iterator<C,void>::type boost::range_adl_barrier::end(T &)' - 注意:使用以下模板参数:注意:'T=const
WrappedRange'
您可以在下面找到相关的代码片段:
- 这就是我要调用的函数,但在编译过程中失败了:
不知何故,这是可行的,但这并不是很干净:
- 这是应返回的 HandleRange 类型:
- 使用的 Handle 对象:
感谢您的任何建议!
c++ - 2个范围的所有组合的迭代器
是否可以使用 boost::iterators 库来创建显示 2 个范围的组合结果的迭代器?请注意,为了使用,我们需要输出是迭代器。我们也不希望首先手动创建所有组合的向量。(注:我们用 C++17 编译)
一个人为的例子:
我检查了boost::iterators的文档,发现:
- Zip:这将第一个范围的第 n 个元素与第二个范围的第 n 个元素组合在一起。但是,不将第 n 个与第 m 个元素结合起来。
- 生成器:需要提供的生成器可以手动记账,保留 6 个迭代器:两个范围的开始、结束和当前。但是,它没有办法阻止它。
- 函数输入:与 Generator 类似,我们可以将这些迭代器置于状态中,并使用 end-iterators 为 end-iterator 创建一个结束状态。但是,状态并没有提供给生成器来计算迭代器的值。
- 排列:适用于单个范围
- 变换:在单个范围内工作
我是否正确得出结论,在这种情况下,唯一的选择是手动编写客户迭代器?
c++ - 扩展 boost::filtered 的迭代器以支持 operator+ 重载
我想添加一个operator+
重载boost::filter_iterator
,如下例所示。但是,我在将模板参数解析为 operator+ 重载函数时遇到错误。
GCC 11.2 错误信息
任何有关错误和可能解决方案的指针将不胜感激。谢谢!