代码如下:
thrust::reduce(thrust::make_transform_iterator(v.begin(), square()),
thrust::make_transform_iterator(v.end(), square()));
取自transform_iterator示例here。具体来说,将以下内容用作第二个迭代器是否多余?
thrust::make_transform_iterator(v.end(), square())
为什么不只使用以下内容呢?
thrust::reduce(thrust::make_transform_iterator(v.begin(), square()),
v.end());
我想在这个特定示例中,由于
thrust::make_transform_iterator(v.begin(), square())
不会生成大小与v
不同的迭代器,所以我更新的代码将执行与原始代码相同的操作,对吗?编辑
我唯一的猜测是要确保两个迭代器的类型相同?我发现所有对此怀疑的怀疑是该文档中的以下文本:“变换函子(即square_root和square)继承自推力:: unary_function。继承自推力:: unary_function可确保函子是有效的AdaptableUnaryFunction并提供所有必要的typedef声明。”虽然,我认为这是指函子本身。
更新
请参阅罗伯特·克罗维拉(Robert Crovella)的评论以获得答案。
最佳答案
此处的迭代器用于标记特定序列的开始和结束。 v.end()
不会在此处标记转换迭代器的序列结尾:
thrust::reduce(thrust::make_transform_iterator(v.begin(), square()),
v.end());
标志着开始。
这里的其他一些构造可能看起来更好(美观在旁观者的眼中),例如:
auto my_iter = thrust::make_transform_iterator(v.begin(), square());
thrust::reduce(my_iter, my_iter+v.size());
关于c++ - make_transform_iterator作为推力::减少算法中第二个参数的意义是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37883853/