我需要订购一组对(一个是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迭代器不是随机访问迭代器)
这回答了你提出的问题:编译错误.这个问题与您的自定义集合比较功能没有任何关系;这将是一个不同的问题.