问题标签 [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++ - c++ 提升范围:any_range 和转换后的适配器
我正在尝试将使用 boost 转换适配器的 boost 范围包装到 boost any 范围中,但这似乎不起作用。我构建了一个最小的例子来说明。
在发布模式下,我的 VS2015 编译器不断告诉我“返回局部变量或临时地址”。该代码在执行时也无法正确执行。在调试模式下一切都很好。
我认为不知何故any_range
无法理解转换后的适配器按值返回,即使我明确地将 Reference 模板参数设置为double
而不是 default double&
。
我在做什么错any_range
?(使用提升 1.64.0)
c++ - 对目录进行更改后,如何“更新” diretory_iterator?
我正在使用 C++ 和 Boost::filesystem 编写程序。该程序应该在给定目录中拍照并将它们移动到文件夹中。每个文件夹应该只保存给定数量的图片。
该路径pic_move_from
在另一个函数中使用。这个另一个函数为此使用了一个目录迭代器path
,并且在这个函数中,目录被添加到 . 引用的目录中path pic_move_from
。我试图为这个目录创建一个新的迭代器,以便我可以将目录中的任何图片移动到新添加的子目录中。但是,新的 directory_iterator 并未“更新”以使用目录中的新条目。那么,如何“更新”directory_iterator?
更新:我试图尽可能简化这段代码,所以我想出了下面的测试/示例。这个例子工作得很好,并在第二次迭代期间打印出新文件夹,所以我必须仔细检查原始代码中的所有内容。
c++ - 提升 zip_iterator 忽略 const 正确性
在以下代码的函数内部的for循环中,即使在循环中使用main()
了,我也可以更改变量内部的变量。有没有办法避免这种情况?ab
const auto&
c++ - 使用 Boost zip_iterator 将两个向量写入 CSV 文件
我有两个要以 CSV 格式写入文件的向量。我可以使用 for 循环“手动”执行此操作,但我第一次尝试使用 boost zip_iterator。这就是我能走多远。(网络版)
请注意,这适用于遗留项目,因此我不能使用较新版本的 C++(例如 C++11、C++14、C++17)
错误消息的片段(整个内容太长,无法粘贴)
c++ - 我编写了 C++ 代码来将 boost::optional 视为一个范围,但它不能编译
我希望将 boost::optional 视为可以包含零个或一个元素的容器。从逻辑上讲,我应该能够为容器创建一个迭代器并在其上使用 boost::for_each。我的尝试如下,但无法编译。我在GodBolt上试过了。
下面的代码供参考。
我相当确定我已经正确地实现了范围和迭代器的概念,但是我在 gcc 8.1 中得到了以下编译器错误(根据 godbolt)
c++ - 使用 boost::range 的相邻适配器
我在问自己是否可以boost-range
通过适配器进行扩展,我称之为adjacentAdaptor
. 这个适配器基本上应该遍历 a 中的所有相邻元素对vector
,list
依此类推。
我认为这个函数在我的用例中非常有用,我经常需要遍历表示时间步长的列表。
最后一个 for 循环的输出应该是这样的:
只有一个元素或没有元素的向量不应该产生任何结果。
我尝试使用boost::adaptors::sliced
生成必要的子列表,但后来我不知道如何boost::range
帮助我将两个子范围压缩到一个。
我刚刚找到了一个可能的解决方案boost::iterators
,但我真的不喜欢必须编写的代码量。我也错过了first
,second
而是我不得不写一个笨拙的get<>
. 不幸的是,如果向量为空,程序就会崩溃!
我很高兴能在这个问题上得到任何帮助。
自己的部分解决方案
经过一些模板类型的推断,我想出了一些相对有用的东西。
first
不过,使用and访问元素会更好second
,但我不知道如何实现这种行为。
c++ - 一起使用 boost compute 和 boost::range 时,如何避免 boost::compute::zip_iterator 和 boost::iterators::zip_iterator 冲突?
我想boost::compute and boost::range
一起使用,如下所示,但如果我取消注释该#include <boost/range/combine.hpp>
行,我会收到一条错误消息,boost::compute::zip_iterator
并且boost::iterators::zip_iterator
是模棱两可的。有没有办法解决这个问题,以便我可以在同一个 cpp 文件中使用boost::compute
和一起使用?boost::range
我在 Windows vs2015 64bit 上使用。提升 1.67.0。
更新:我发现如果我尝试包含boost/iterator/zip_iterator.hpp
而不是会发生相同的错误boost/range/combine.hpp
,因此它不是特定于 Boost Range 库。
代码:
错误:
1>----- 构建开始:项目:demo,配置:Debug x64 ------ 1> demo.cpp 1> 这个头文件是实现细节并提供向后兼容性。1>C:\local\boost_1_67_0\boost/compute/algorithm/transform.hpp(67): error C2668: 'boost::compute::make_zip_iterator': 对重载函数的模糊调用 1> C:\local\boost_1_67_0\boost /compute/iterator/zip_iterator.hpp(276): 注意: 可能是'boost::compute::zip_iterator,boost::compute::buffer_iterator,boost::tuples::null_type,boost::tuples::null_type,boost ::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type>> boost: :compute::make_zip_iterator,boost::compute::buffer_iterator,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::
T=boost::compute::float4_, 1>
IteratorTuple=boost::tuples::tuple,boost::compute::buffer_iterator,boost::tuples::null_type,boost::tuples::null_type,boost::tuples ::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type> 1> ] 1> C :\local\boost_1_67_0\boost/iterator/zip_iterator.hpp(357): 注意: 或
'boost::iterators::zip_iterator,boost::compute::buffer_iterator,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost ::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type>> boost::iterators::make_zip_iterator,boost::compute::buffer_iterator,boost: :tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples ::null_type,boost::tuples::null_type>>(IteratorTuple)' [使用参数相关查找找到] 1> with 1> [ 1> T=boost::compute::float4_, 1>
IteratorTuple=boost::tuples::tuple,boost::compute::buffer_iterator,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type, boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type> 1> ] 1> C:\local\boost_1_67_0\boost/compute/algorithm/ transform.hpp(67): 注意:在尝试匹配参数列表时 '(boost::tuples::tuple,boost::compute::buffer_iterator,boost::tuples::null_type,boost::tuples::null_type, boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type>)' 1> 与 1> [ 1>
T=boost::compute::float4_ 1> ] 1> C:\workspaces\compute_test\src\demo.cpp(45): 注意:见参考函数模板实例化'OutputIterator boost::compute::transform,boost: :compute::buffer_iterator,boost::compute::buffer_iterator,boost::compute::lambda::expression>(InputIterator1,InputIterator1,InputIterator2,OutputIterator,BinaryOperator,boost::compute::command_queue &)' 正在编译 1> 1> [ 1>
OutputIterator=boost::compute::buffer_iterator, 1>
T=boost::compute::float4_, 1>
Expr=boost::proto::exprns_::basic_expr,0>>,const boost: :compute::lambda::expression>,0>> &,const boost::compute::lambda::expression>,0>> &>,3>, 1>
InputIterator1=boost::compute::缓冲区迭代器,1>
InputIterator2=boost::compute::buffer_iterator, 1>
BinaryOperator=boost::compute::lambda::expression,0>>,const boost::compute::lambda::expression>,0>> &,const boost::compute::lambda::expression>,0> > &>,3>> 1> ] 1>C:\local\boost_1_67_0\boost/compute/algorithm/transform.hpp(68): error C2668: 'boost::compute::make_zip_iterator': 对重载函数的模糊调用1> C:\local\boost_1_67_0\boost/compute/iterator/zip_iterator.hpp(276): 注意: 可能是'boost::compute::zip_iterator,boost::compute::buffer_iterator,boost::tuples::null_type ,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost ::tuples::null_type>> boost::compute::make_zip_iterator,boost::compute::buffer_iterator,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost: :tuples::null_type>>(IteratorTuple)' 1> with 1> [ 1>
T=boost::compute::float4_, 1>
IteratorTuple=boost::tuples::tuple,boost::compute::buffer_iterator,boost::tuples::null_type,boost::tuples::null_type,boost::tuples ::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type> 1> ] 1> C :\local\boost_1_67_0\boost/iterator/zip_iterator.hpp(357): 注意: 或
'boost::iterators::zip_iterator,boost::compute::buffer_iterator,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost ::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type>> boost::iterators::make_zip_iterator,boost::compute::buffer_iterator,boost: :tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples ::null_type,boost::tuples::null_type>>(IteratorTuple)' [使用参数相关查找找到] 1> with 1> [ 1> T=boost::compute::float4_, 1>
IteratorTuple=boost::tuples::tuple,boost::compute::buffer_iterator,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type, boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type> 1> ] 1> C:\local\boost_1_67_0\boost/compute/algorithm/ transform.hpp(68): 注意:在尝试匹配参数列表时 '(boost::tuples::tuple,boost::compute::buffer_iterator,boost::tuples::null_type,boost::tuples::null_type, boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type>)' 1> 与 1> [ 1>
T=boost::compute::float4_ 1> ] 1>C:\local\boost_1_67_0\boost/compute/algorithm/transform.hpp(72): error C2672: 'transform': 找不到匹配的重载函数 1>C: \local\boost_1_67_0\boost/compute/algorithm/transform.hpp(72): error C2780: 'OutputIterator boost::compute::transform(InputIterator1,InputIterator1,InputIterator2,OutputIterator,BinaryOperator,boost::compute::command_queue &) ': 需要 6 个参数 - 提供 4 个 1> C:\local\boost_1_67_0\boost/compute/algorithm/transform.hpp(55): 注意:参见 'boost::compute::transform' 的声明 ====== ==== 构建:0 成功,1 失败,2 最新,0 跳过 ==========
c++ - Boost iterator_facade 实现
我希望熟悉 boost iterator_facade 实现的人能够阐明为什么在选择writable_postfix_increment_proxy
或时使用以下元函数postfix_increment_proxy
。
这可以在此处找到,并在元函数postfix_increment_result中使用,该函数选择后缀运算符是否应返回代理或仅返回迭代器。其余的postfix_increment_result
似乎很清楚。就像是..
如果 iter::reference 是可读的并且类别基本上等同于 input_iterator_tag 或 output_iterator_tag 则返回一个代理。
但是我很困惑is_non_proxy_reference
,这似乎true
与忽略 cv 限定符Reference
相同。Value
在这种情况下使用postfix_increment_proxy<Iterator>
else writable_postfix_increment_proxy<Iterator>
。
什么Reference
时候会成为不同的“基本类型” Value
?如果您愿意,这是否支持返回您自己的代理类型?或者是其他东西?
c++ - 为什么这个涉及具有不可移动类型的 boost::transform_iterator 的代码不起作用?
这段代码的灵感来自几天前 Stack Overflow 上的另一个问题。它尝试使用一个转换迭代器来构造一个std::vector
包含不可移动的类型。
不幸的是,此代码无法编译(https://wandbox.org/permlink/20xMUsCBUg44YmXC)。来自 Clang 的错误消息提到std::vector
范围构造函数被禁用,因为:
no type named 'reference' in 'std::__1::iterator_traits<boost::iterators::transform_iterator<(lambda at prog.cc:22:16), std::__1::__wrap_iter<int *>, boost::iterators::use_default, boost::iterators::use_default> >'
但是我看不出为什么这个iterator_traits
专业不应该有一个名为reference
.