あなたが求めていることを行う直接的な方法はありません。機能的に同じことを達成するには、2 つのオプションがあります。
1 つ目は、呼び出しの前に値配列のコピーを作成し、元のデータの並べ替え済みおよび並べ替えなしのバージョンを残すことです。だからあなたの例は
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());
2 番目の方法は、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
[標準免責事項: すべてのコードはブラウザーで記述され、コンパイルもテストもされていません。自己責任で使用してください]