守则如下:
thrust::reduce(thrust::make_transform_iterator(v.begin(), square()),
thrust::make_transform_iterator(v.end(), square()));摘自transform_iterator示例这里。具体来说,使用以下内容作为第二个迭代器不是多余的吗?
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)继承自thrust::unary_function,从thrust::unary_function继承确保函子是有效的AdaptableUnaryFunction,并提供了所有必要的typedef声明。”不过,我认为这具体指的是函子本身。
更新
请参阅的评论。
发布于 2016-06-21 18:44:02
这里的迭代器用于标记特定序列的开始和结束。在这里,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());https://stackoverflow.com/questions/37883853
复制相似问题