【问题标题】:sort array by first item in subarray c++ [closed]按子数组c ++中的第一项对数组进行排序[关闭]
【发布时间】:2017-09-23 17:16:38
【问题描述】:

我有一个数组数组,例如:[[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;
    }

}

【问题讨论】:

  • C++ 中不能有这样的数组。显示代码!
  • 如果没有显示您如何定义数组的代码,我们无法告诉您如何对它们进行排序。我们无法确定您对数组的定义...
  • 对不起,我对 C++ 很陌生。我不确定我如何声明数组是好的/有效的。我编辑了问题并输入了代码。
  • 有没有办法在 C++ 中做到这一点——答案是“是”。那你想让我们做什么?
  • 那么这里是给你的问题——你愿意跳出框框思考吗?对二维数组进行排序的一种方法是对数组进行排序,而是对指向数组内部的索引数组进行排序,然后使用排序后的索引来访问元素。这样做比在排序函数中操作二维数组要容易得多。请see this as an example

标签: c++


【解决方案1】:

对数组进行排序的一种方法是不对数组本身进行排序

相反,对指向数组内部的索引数组进行排序,然后使用排序后的索引来访问元素。这样做比在排序函数中操作二维数组要容易得多。

一般来说,如果你有索引数组的内存(我们需要额外的索引数组的存储空间),那么对有的对象进行排序

  1. 每个项目的有效负载很大,或者
  2. 需要保留数组的原始顺序,或者
  3. 排序只是笨拙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";
}

Live Example

所以基本上我们创建了一个从 0 到 n-1 编号的初始索引数组,其中 n 是要排序的项目数。然后我们在索引上调用std::sort,在排序标准中,我们使用传递给排序谓词的索引来比较实际数组中的项目。结果将是索引数组在排序期间交换了其元素,而不是交换了原始数组的元素。

请注意,排序谓词非常简单——我们通过使用timeTable 数组上传递的索引来准确说明我们希望索引在排序中表示的内容。如果其中一项出现故障,则没有任何棘手、容易出错或无法很好扩展的代码(例如,并行数组方案——想象有 20 个数组,并且必须交换 20 个项目,因为其中一项出现了问题顺序)。

在对索引进行排序之后,当需要使用timeTable 数组时,我们使用索引数组来指向项目(注意我们如何使用timeTable[index[i]][0] 而不是timeTable[i][0] 来指定索引)。


1 包含在“笨拙”类别中的是那些“平行 数组排序”问题出现在 StackOverflow 上,要求发布者根据其中一个数组中的数据“并行”对多个数组进行排序。

【讨论】:

  • 加入std::iota()不是一个很好的机会吗? ;-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多