代码如下:
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
大小不同的迭代器,我的更新代码会与原始代码做同样的事情,这是正确的吗? / p>
修改
我唯一的猜测是确保两个迭代器属于同一类型?所有我发现确认我对此的怀疑是文档中的以下文本“转换仿函数(即square_root和square)继承自thrust :: unary_function。继承自thrust :: unary_function确保仿函数是有效的AdaptableUnaryFunction并提供所有必要的typedef声明。“虽然,我认为这具体指的是仿函数本身。
更新
请参阅Robert Crovella的评论以获得答案。
答案 0 :(得分:1)
此处的迭代器用于标记特定序列的开头和结尾。 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());