我有一个数组数组,例如:[[4, 204], [10, 39], [1, 500]]
)。
我希望通过子数组的第一个元素对它们进行排序,使其变为:[[1, 500], [4, 204], [10, 39]]
。
我无法找到C++
这个问题的任何答案。
我如何在C++
中执行此操作?
代码:
int n;
int time;
int timeTable[100][2];
if (inputFile.is_open()) {
for (int i = 0; i < 100; i++) {
inputFile >> n;
timeTable[i][0] = n;
inputFile >> time;
timeTable[i][1] = time;
}
}
答案 0 :(得分:1)
对二维数组进行排序的一种方法是不对数组本身进行排序。
相反,对指向数组内部的索引数组进行排序,然后使用排序索引访问元素。这比在排序函数中操作二维数组要容易得多。
通常,如果你有索引数组的内存(我们需要为索引数组添加额外的存储空间),那么对具有大负载或者只是笨拙 1 的对象进行排序或者不可能在排序算法中轻松操作可以使用这种技术。
以下是一个例子:
#include <algorithm>
#include <iostream>
int main()
{
int index[3] = {0,1,2};
int timeTable[3][2] = {{4, 204}, {10, 39}, {1, 500}};
std::sort(index, index + 3, [&](int n1, int n2){ return timeTable[n1][0] < timeTable[n2][0]; });
for (int i = 0; i < 3; ++i)
std::cout << "The index is " << index[i] << ". The data at this index is [" <<
timeTable[index[i]][0] << " " << timeTable[index[i]][1] << "]\n";
}
基本上我们创建一个从0到n-1
的初始索引数组,其中n
是要排序的项目数。然后我们在索引上调用std::sort
,在排序标准中,我们使用传递给排序谓词的索引来比较实际数组中的项。结果将是索引数组在排序期间交换元素而不是交换原始数组的元素。
请注意,排序谓词非常简单 - 我们通过使用timeTable
数组上传递的索引来准确说明我们希望索引在排序中表示什么。没有棘手,容易出错或代码如果其中一个项目出现故障就无法很好地扩展(例如,并行阵列场景 - 想象20个阵列并且因为一个项目已经出来而不得不交换20个项目订单)。
在对索引进行排序后,当需要使用timeTable
数组时,我们使用索引数组指向项目(请注意我们如何使用timeTable[index[i]][0]
而不是{{来指定索引1}})。
1 包括在&#34;笨拙&#34;类别是&#34; parallel 数组排序&#34; StackOverflow上出现的问题,要求海报对多个阵列进行排序&#34;并行&#34;基于其中一个阵列中的数据。