如何在c中使用两个排序标准(对于一组对)创建有序集?

我需要订购一组对(一个是int,第二个是char),我需要像我这样订购我的订单:

12 G,11 F,10 A,10 B,10 C(按第一个降序排列,按秒升序排列)

首先.这是我到目前为止所尝试的,我得到一些错误:

#include <iostream>
#include <fstream>
#include <algorithm>
#include <utility>
#include <set>

using namespace std;
set <pair <int,char> > s;

bool myfunction( const pair<int, char>& i, const pair<int, char>& j ) {
    if( i.first < j.first ) return false;
    if( j.first < i.first ) return true;
    return j.second < i.second;
}

void writes()
{   set <pair<int,char> >::iterator it;
    for (it = s.begin();it<= s.end();it++) /// line (18)
        cout<<(*it).second<<" "<<(*it).first<<"\n\n";
}
int main()
{   ifstream f("info.in");
    int n;
    f>>n;
    for (int i=1;i<=n;i++)
    {   pair<int,char> x;
        int st;
        char nd;
        f>>st;
        f>>nd;
        x.first=st;
        x.second=nd;
        s.insert(x);
    }
    writes();
}

第一个错误我得到的是第(18)行:不匹配’operator< ='(操作数类型是’std :: set> :: …..

非常感谢您的帮助

我的输入文件如下所示:

5
10 B
10 A
10 C
11 F
12 G

@Sam Varshavchik,谢谢!这解决了我的错误问题.
但是,我仍然没有得到我需要的输出.
我只得到:

10 A
10 B
10 C
11 F
12 G

是否可以更改配对中的订单标准?如果没有,你会建议使用什么?

它看起来像订购标准的myfunction仍然被程序忽略.怎么我在我的对内超载它?看起来,它只是坐在那里,它从未使用过.无论如何,该计划都能胜任

我也试过这个:Using custom std::set comparator
但它仍然无法正常工作

using namespace std;

struct lex_compare {
    bool operator()(const pair<int, char>& i, const pair<int, char>& j )
{
   if( i.first != j.first )
   {
      return (i.first > j.first);
   }

   return (j.second > i.second);
}
} // forgot ";", after adding it, it works perfectly.
set <pair <int,char>, lex_compare > s; ///line (22)

void writes()
{   set <pair<int,char> >::iterator it;
    for (it = s.begin();it!= s.end();it++) /// line (18)
        cout<<(*it).second<<" "<<(*it).first<<"\n\n";
}
int main()
{   ifstream f("info.in");
    int n;
    f>>n;
    for (int i=1;i<=n;i++)
    {   pair<int,char> x;
        int st;
        char nd;
        f>>st;
        f>>nd;
        x.first=st;
        x.second=nd;
        s.insert(x);
    }
    writes();
}

错误:第(22)行:’s’之前的无效声明者;

最佳答案

for (it = s.begin();it<= s.end();it++)

通常,迭代器不会实现比类型更少/更大的比较.通常,迭代器只实现==和!=比较,测试是否相等.这应该是:

for (it = s.begin();it != s.end();it++)

(只有随机访问迭代器可以安全地使用 运算符进行比较,而std :: sets迭代器不是随机访问迭代器)

这回答了你提出的问题:编译错误.这个问题与您的自定义集合比较功能没有任何关系;这将是一个不同的问题.

点赞