我目前按照以下方式按键排序值
thrust::sort_by_key(thrust::device_ptr<int>(keys),
thrust::device_ptr<int>(keys + numKeys),
thrust::device_ptr<int>(values);
根据“keys”对“values”数组进行排序。
有没有办法让“values”数组保持不变,而是将“values”的排序结果存储在一个单独的数组中?
提前致谢。
答案 0 :(得分:2)
没有直接的方法来做你要求的事情。你有两种选择在功能上实现同样的目标。
第一个是在调用之前复制values数组,为您提供原始数据的已排序和未排序版本。所以你的例子变成了
thrust::device_vector<int> values_sorted(thrust::device_ptr<int>(values),
thrust::device_ptr<int>(values + numKeys));
thrust::sort_by_key(thrust::device_ptr<int>(keys),
thrust::device_ptr<int>(keys + numKeys),
values_sorted.begin());
第二种方法是不要将values数组传递给所有的排序。 Thrust有一个非常有用的置换迭代器,它允许对数组进行无缝置换访问,而无需修改存储该数组的顺序(所以如果你愿意,那么基于迭代器的收集操作)。为此,创建一个索引向量,然后按键对其进行排序,然后使用该排序索引实例化一个置换迭代器,如
typedef thrust::device_vector<int>::iterator iit;
thrust::device_vector<int> index(thrust::make_counting_iterator(int(0)),
thrust::make_counting_iterator(int(numKeys));
thrust::sort_by_key(thrust::device_ptr<int>(keys),
thrust::device_ptr<int>(keys + numKeys),
index.begin());
thrust::permutation_iterator<iit,iit> perm(thrust::device_ptr<int>(values),
index.begin());
现在perm
将values
按keys
排序的顺序返回index
,而不会更改原始数据的顺序。
[标准免责声明:所有代码均以浏览器编写,绝不编译或测试。使用风险自负]