假设有一个整数数组:
A[]={2, 2, 9, 8, 5, 7, 0, 6}
和模板:
B[]={1, 0, 0, 1, 1, 1, 0, 1}
我的问题是我们如何根据 B[] 重新排列 A[] 使得如果 B[i]==1,B[j]==0,那么 A[i] 将保证在 A[j] 之前新数组,应如下所示:
C[]={2, 8, 5, 7, 6, 2, 9, 0}
PS:我发现“分区”功能几乎是答案,只是它只支持谓词。有什么解决方法吗?
非常感谢任何提示!
既然已经实现了 stencil (可能需要从官方 Thrust 存储库获取源代码thrust::partition
),这可以通过以下方式实现:thrust::stable_partition
#include <thrust/partition.h>
struct is_one
{
__host__ __device__
bool operator()(const int &x)
{
return x == 1;
}
};
// Partition values on device thanks to stencil
thrust::stable_partition(d_A.begin(),
d_A.end(),
d_B.begin(),
is_one());
这导致:
A = 0 1 2 3 4 5 6 7 8 9 B = 0 1 1 0 0 1 0 0 1 0 C = 1 2 5 8 0 3 4 6 7 9
此实现更有效,因为我们不对两个分区中的值进行排序。此处提供了一个类似且更复杂的示例(答案中有更多详细信息)。