【问题标题】:Cannot sort vector<pair<int, int>>无法对向量<pair<int, int>> 进行排序
【发布时间】:2020-08-03 02:56:47
【问题描述】:

我尝试使用 STL 排序和我自己的布尔函数对 vector&lt;pair&lt;int, int&gt;&gt; 进行排序。

#include <bits/stdc++.h>
using namespace std;

bool comp(pair<int, int> u1, pair<int, int> u2){
    if(u1.first != u2.first) return u1.first < u2.first;
    return u2.second > u2.second;
}

int main(void){
    ios_base::sync_with_stdio(false);
    cin.tie(NULL); cout.tie(NULL);
    int univs, day, pay, max_income = 0, spent = 0;
    vector<pair<int, int>> day_pay;
    cin >> univs;
    for(int u = 0; u < univs; u++){
        cin >> pay >> day;
        day_pay.push_back(make_pair(day, pay));
    }
    for(int i = 0; i < univs; i++) cout << day_pay[i].first << " " << day_pay[i].second << endl;
    cout << endl;
    sort(day_pay.begin(), day_pay.end(), comp);
    for(int i = 0; i < univs; i++) cout << day_pay[i].first << " " << day_pay[i].second << endl;
    for(int u = 0; u < univs; u++){
        if(day_pay[u].first <= spent) continue;
        max_income += day_pay[u].second;
        spent++;
    }
    cout << max_income;
}

这是测试用例:

4
50 2
10 1
20 2
30 1

我想把这个案例排序为

30 1
10 1
50 2
20 2

我应该怎么做才能解决这个问题?

【问题讨论】:

  • 我猜应该是u1.first &gt; u2.first!!
  • 为了澄清-您要进行排序,以便首先比较第二个元素并且按顺序较低的数字等于较早,然后如果第二个元素相等,您比较第一个元素并且按顺序较早的数字等于?您能否添加一些共享相同第一个元素的对,并在您的示例中显示您希望它们如何排序?
  • 需要有一个 wiki 页面,类似于“为什么竞争性编码网站不利于学习?”
  • @sweenish 也许他们打字太快了,他们看不到自己打错了字。这个错误看起来更像是一个错字,而不是一致努力比较错误的项目。

标签: c++ sorting stl


【解决方案1】:

线

return u2.second > u2.second;

是可疑的。你很可能是说

return u1.second > u2.second;

【讨论】:

    【解决方案2】:

    看看你的 comp 函数。 if 后面的行:

    return u2.second > u2.second;
    

    不应该是这样的:

    return u1.second > u2.second
    

    【讨论】:

      【解决方案3】:

      Caleth 在他们的回答中很好地指出了实际的错误。但我认为这么多代码足以进行排序。您可以根据您的问题进行修改。

      #include <iostream>
      #include <utility>
      #include <vector>
      
      int main() {
          std::size_t n;
          std::cin >> n;
      
          std::vector<std::pair<int, int>> v(n);
          for (auto &&i : v) std::cin >> i.first >> i.second;
      
          std::sort(v.begin(), v.end(),
                    [](std::pair<int, int> &a, std::pair<int, int> &b) {
                        return a.second != b.second ? a.second < b.second
                                                    : a.first > b.first;
                    });
      
          for (auto &&i : v) std::cout << i.first << ' ' << i.second << '\n';
      }
      

      如果你使用的是 C++ 14 或更高版本,可以直接使用auto in lambda params

      Sample Run:

      示例输入:

      4
      50 2
      10 1
      20 2
      30 1
      

      对应的输出:

      30 1
      10 1
      50 2
      20 2
      

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多