我有一些数据安排如下:
size_t num_elements = //...
some_type_t *data = //...
int *scores = //...
每个元素data[i]
在scores[i]
中都有一个相应的分数。我想使用data
数组对scores
和scores
进行排序,以对数据进行排序。
例如,对于数据:
data = {'d', 'g', 'i', 'a', 'p'}
scores = {3, 5, 1, 2, 4}
排序后的版本为
data = {'i', 'a', 'd', 'p', 'g'}
scores = {1, 2, 3, 4, 5}
是否可以使用C ++标准库来做到这一点? 我不希望不需要包含Boost或尚未标准化的库。
我还想避免不必要地复制数据。这包括将其转换为结构数组。
答案 0 :(得分:1)
假设没有理由不合并两个数据数组,最简单的答案是使用重载运算符将它们合并为struct
或class
(可能是前者)。然后,您可以定义一个由这些结构/类组成的数组,这些数组将把数据绑定在一起,以便数据和得分一起移动。
struct ScoredData
{
some_type_t data;
int score;
bool operator<(const ScoredData& right)
{
return this->score < right.score;
}
}
(可以通过将some_type_t
用作模板参数来扩展此示例)
如果以这种方式将它们组合在一起是不可接受的,则可能会成功定义一个模仿此行为的迭代器。
答案 1 :(得分:0)
您可以将这些元素分组到这些对的新数组中,然后使用 sort 对其进行排序,并在正确的对元素上进行比较,然后从已排序的对对数组中更新初始数组吗? >
更好:
您创建一个由 score 值和第一对夫妇的索引0,然后第二对1,第三对2的索引组成的对的向量,因此不要复制数据>
您 qsort 该对夫妇数组考虑分数部分,之后您只需要查看夫妇中索引的新顺序即可对得分和数据轻松更新它们
答案 2 :(得分:0)
执行此操作的另一种方法是创建索引数组(使用0、1、2、3 ...对其进行初始化),并使用score[a] < score[b]
比较对其进行排序。
然后,您需要根据索引重新排列分数和数据数组。例如,如果排序后index [0] = 3,则需要移动元素score [0] = score [3];数据[0] =数据[3]。
不幸的是,我看不到一种避免复制的方法。