【问题标题】:How to sort doubles in a vector in order? [duplicate]如何按顺序对向量中的双精度数进行排序? [复制]
【发布时间】:2022-01-24 19:56:31
【问题描述】:

我应该创建一个程序,让用户输入跑步者的姓名和时间。当用户输入DONE时,用户将开始输入跑步者的时间,以-1结尾。

程序最终应该打印出所有按照跑者个人最快时间排序的跑者 (首先打印时间最快的跑步者,其次是时间第二快的跑步者,依此类推)。还 必须打印跑者自己的时间,首先打印最快的时间,其次是第二快的 时间等打印的时间必须用一个空格隔开。

为了清楚起见,在终端中,它应该如下所示:

Enter participants:
Kalle Svensson Glommen IK
Anna Nilsson Glommen IK
Per-Erik Jonsson Tuna OK
DONE
Times Kalle: 12.34 10.01 -1.00
Times Anna: 8.05 9.57 10.00 12.34 -1.00
Times Per-Erik: 10.44 -1.00
Surname First name Club: Times
==========================================
 Nilsson Anna Glommen IK: 8.05 9.57 10.00 12.34
 Svensson Kalle Glommen IK: 10.01 12.34
 Jonsson Per-Erik Tuna OK: 10.44

当我编译并运行我的程序时,我的终端将如下所示:

Enter participants: 
Kalle Svensson Glommen IK
Anna Nilsson Glommen IK
Per-Erik Jonsson Tuna OK
DONE 
Times Kalle: 12.34 10.01 -1.00
Times Anna: 8.05 9.57 10.00 12.34 -1.00
Times Per-Erik: 10.44 -1.00
Surname   First name          Club: Times
==========================================
 Svensson     Kalle      Glommen IK 12.34 10.01
  Nilsson      Anna      Glommen IK 8.05 9.57 10 12.34
  Jonsson  Per-Erik         Tuna OK 10.44

如您所见,它应该按时间对跑步者进行排序。最好的跑者应该放在第一位,他的所有时间都应该按顺序排列。这不会发生在这里,我不知道如何解决它。

这是我的代码:

include <iostream>
#include <iomanip>
#include <string>
#include <vector>
#include <algorithm>

using namespace std;

struct Runner_Type {
  string first_name;
  string surname;
  string club;
  string club_last;
  vector<double> time; 
};

using Many_Runners_Type = vector<Runner_Type>;

void print(Runner_Type const & runner) {
  cout << setw(9) << runner.surname << setw(10) << runner.first_name << setw(13) << runner.club << setw(3) << runner.club_last;

  for (double const tid : runner.time) {
    cout << ' ' << tid;
  }
}

void print(Many_Runners_Type const & many_runners) {
  for (Runner_Type const & runner : many_runners) {      
    print(runner);
    cout << endl;
  }
}

bool operator<(Runner_Type const & lhs, Runner_Type const & rhs) {
  for (int j {}; j < static_cast<int>(lhs.time.size()); ++j) {
    if (lhs.time.at(j) < rhs.time.at(j)) {
      return true;
    }
    else if (lhs.time.at(j) > rhs.time.at(j)) {
      return false;
    }
  }

  return true;
}

int main() {
  Runner_Type runner {};
  Many_Runners_Type many_runners {};
  string name {};
  double tid {};

  cout << "Enter participants: " << endl;

  while (true) {
    cin >> name;

    if (name == "DONE") {
      break;
    }

    runner.first_name = name;

    cin >> runner.surname >> runner.club >> runner.club_last;
    many_runners.push_back(runner);
  }

  for (size_t i {}; i < many_runners.size(); ++i) {
    cout << "Times " << many_runners.at(i).first_name << ": ";

    while (cin >> tid && tid != -1.0) {
      many_runners[i].time.push_back(tid);
    }
  }
  
  cout << "Surname" << setw(11) << "First name" << setw(23) << "Club: Times" << endl;
  cout << "==========================================" << endl;

  // sort(begin(many_runners), end(many_runners));
  sort(begin(runner.time), end(runner.time));
  print(many_runners);
  cout << endl;

  return 0;
}

我相信这是一个小问题,但我似乎无法解决它。当我尝试在 void print(Many_Runners_Type const &amp; many_runners)子程序的 for 循环中执行 sort(begin(runner.time), end(runner.time)); 时,我会看到大量包含大量错误消息的页面。

所以我的问题是;如何对我的跑步者时间进行排序,以使其满足给定的要求?非常感谢您的帮助。

【问题讨论】:

  • 你能把这个减少到minimal reproducible example吗?这里有很多只是噪音,有些人(我)很难读懂。在我的脑海中,您的比较运算符可能不会强加严格的弱排序。
  • 标题中问题的规范答案是:std::sort(vector.begin(), vector.end())
  • 我看到你在使用std::cin &gt;&gt; some_variable; use(some_variable);:如果读取操作成功,你需要总是检查after尝试读取!不检查输入是否成功是一个巨大的错误来源。
  • @DietmarKühl 将输入的责任转移给用户是有效的,尤其是对于学校问题。您并不总是需要检查。
  • @JohnFilleau:我不同意,因为即使在专业代码中,我也总是看到这个不正确的代码!也就是说,需要从一开始就教正确阅读输入。

标签: c++ vector


【解决方案1】:

您只对用户输入的最后一个 runnertime 向量进行排序(您在previous question 的代码中犯了类似的错误,您在其中推送每个人的@ 987654326@ 值只输入到最后一个 runner 输入)。

您需要在填充many_runners[i].time 的循环完成后添加对sort() 的调用,以便您对每个 跑步者的time 向量进行排序,例如:

for (size_t i {}; i < many_runners.size(); ++i) {
    cout << "Times " << many_runners[i].first_name << ": ";

    while (cin >> tid && tid != -1.0) {
        many_runners[i].time.push_back(tid);
    }

    sort(begin(many_runners[i].time), end(many_runners[i].time)); // <-- ADD THIS
}

现在每个跑步者的times 从最快到最慢排序,每个跑步者的最快时间存储在time[0] 中,因此这是您的operator&lt; 需要比较的唯一向量值,而不是整个向量,例如:

bool operator<(Runner_Type const & lhs, Runner_Type const & rhs) {
    if (!lhs.time.empty()) {
        return rhs.time.empty()  || lhs.time[0] < rhs.time[0];
    }
    else {
        return rhs.time.empty();
    }
}

最后,在print() 之前对sort() 的最终调用需要更改为对many_runners 向量进行排序(就像我已经在my answer 中向您展示过的previous question),而不是time最后一个runner的向量:

sort(begin(many_runners), end(many_runners)); // <--
print(many_runners);

【讨论】:

  • 最佳时间意味着最少的时间。正如您在示例中看到的那样,最好时间的跑步者应该放在第一位,他/她的时间应该按照从低到高的升序排列。我该怎么做?
  • 所以如果一个跑步者有 12,35s, 45,23s 和 11.23s。最佳时间是 11.23s
  • 关于这个的事情是所有跑步者的时间也需要按升序排列,所以如果查尔斯输入以下时间:12.23 5.23 15.12 -1.00,它需要是:5.23 12.23 15.12。查看它在终端中的外观示例
  • @Cebu 对单个跑步者的时间进行排序很容易。那不是问题。我在质疑你想如何对跑步者之间的顺序进行排序。你说“最好的跑步者应该排在第一位”但这究竟是什么意思? Anna 的 4 次如何被认为比 Kalle 的 2 次或 Erik 的 1 次“更好”?您用来确定“更好”的标准是什么?在这个问题或您之前的问题中,这就是您尚未明确定义的内容。请这样做。
  • 程序最终会打印出所有按照跑者个人最快时间排序的跑者(最快的跑者首先打印,其次是时间第二快的跑者,等等)。此外,必须打印跑步者自己的时间,其中最快的时间首先打印,其次是第二快的时间,等等。打印的时间必须用一个空格隔开。
猜你喜欢
  • 2016-11-22
  • 2013-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-30
  • 1970-01-01
  • 2016-08-24
相关资源
最近更新 更多