从推力框架的一个奇特的迭代器派生出来的规范方法是什么?
我将3D点存储在数组结构中。现在我正在考虑从中获取blas矢量类型的便捷方法。我想出的是这样的事情:
namespace abc {
typedef VERY_BASIC_LINEAR_ALGEBRA_VECTOR_CLASS_FOR_TESTING t_vector;
typedef typename thrust::device_vector::iterator t_baseIterator;
typedef typename thrust::tuple<t_baseIterator,t_baseIterator,t_baseIterator> t_iteratorTuple;
typedef typename thrust::zip_iterator<t_iteratorTuple> t_zipIterator;
struct custom_iterator: public t_zipIterator {
custom_iterator(t_zipIterator zi): t_zipIterator(zi) {}
t_vector getVector() {
return t_vector(**this);
}
void setVector(const t_vector& v) {
**this = (t_tuple)v;
}
};
}
这很有效。这意味着我可以执行类似it.getVector()
(其中it
是有效的custom_iterator)的操作,并将此custom_iterators传递给推力计算基元,例如transform_reduce。
我已经搜索了更多关于推力的文档并找到了thrust::iterator_adaptor
。现在的问题是:是否应该使用iterator_adaptor
?如果是这样,为什么?上面代码的优点和缺点是什么?使用iterator_adaptor
:
#include <thrust/iterator/iterator_adaptor.h>
class custom_iterator: public thrust::iterator_adaptor<custom_iterator, t_zipIterator> {
public:
typedef thrust::iterator_adaptor<custom_iterator, t_zipIterator> super_t;
custom_iterator(const t_zipIterator &zi) : super_t(zi) {}
t_vector getVector() {
return t_vector(**this);
}
void setVector(const t_vector& v) {
**this = (t_tuple)v;
}
friend class thrust::iterator_core_access;
};
我不知道这是否有效,因为我没试过。
所以问题是:做这个的规范方式是什么?
与此相关的另一个问题是: thrust :: transform_reduce或thrust :: transform_iterator使用的仿函数必须接受给定迭代器的基础类型,而不是迭代器本身。所以上面的custom_iterator几乎没用。有没有办法在使用的函子的operator()成员函数中接受迭代器而不是解引用的迭代器?
你可能会问自己为什么我想要一个带有这个额外的getter和setter的派生迭代器,如上面的例子表明t_vector
初始化了zip_iterator的底层元组。但这仅仅是一个例子,而且有一个更复杂的案例,其中上述概念将是一种非常方便的方式。
答案 0 :(得分:-1)
由于我无法在thrust::zip_iterator
或thrust::iterator_adaptor
中找到虚拟析构函数,我认为从任何一个派生出来都是一个坏主意。