我想通过person.name和年龄来排序一个人向量。因此,我试图覆盖Person
定义中的operator<
,并使用函数与std::sort()
。排序与运算符重写没有得到我想
但是,我没有得到我想要的。我的期望是,人们首先按他们的名字命名,然后按他们的年龄排序。但我得到同样的结果有两个解决方案:
che is less than xu
(wu, 30)
(che, 34)
(xu, 21)
我所期望的顺序是:
(che, 34)
(wu, 30)
(xu, 21)
任何人都可以帮助一点,我所犯的错误?感谢
的源代码是:
class Person{
public:
string _name;
int _age;
public:
Person(string name, int age):_name(name),_age(age){
}
bool operator<(const Person* b) const {
cout<<"Expect "<<_name <<b->_name <<" "<< (_name < b->_name)<<endl;
if(_name != b->_name) {
return _name < b->_name;
}
else return _age<b->_age;
}
bool operator<(const Person& b) const {
if(_name!=b._name) {
cout<<_name <<" is less than "<<b._name<<endl;
return _name<b._name;
} else return _age<b._age;
}
friend ostream& operator<<(ostream& out, const Person& b) {
out << "(" << b._name << ", " << b._age << ")"<<endl;
return out;
}
};
bool PersonCompare(const Person* a, const Person* b){
cout<<"Expect "<<a->_name <<b->_name <<" "<< (a->_name < b->_name)<<endl;
if(a->_name != b->_name) {
return a->_name < b->_name;
}
else return a->_age<b->_age;
}
class PersonPrint{
public:
PersonPrint(){
}
void operator()(const Person& person){
cout<<person;
}
void operator()(const Person* person){
cout<<*person;
}
};
void testSort(){
vector<Person*> personsList;
personsList.push_back(new Person("xu", 12));
personsList.push_back(new Person("che", 23));
personsList.push_back(new Person("sxy", 34));
/*std::sort(personsList.begin(), personsList.end(), [](Person* a, Person* b){
if(a->_name!=b->_name) return a->_name<b->_name;
else return a->_age<b->_age;
}); *///This works
/* std::sort(personsList.begin(), personsList.end(), PersonCompare) *///This works..
std::sort(personsList.begin(), personsList.end()); //This does not work
for_each(personsList.begin(), personsList.end(), PersonPrint());
}
============== 它是λ-/操作者的内部的逻辑错误。将if(a._name<b._name)
更改为if(a._name!=b._name)
后,错误得到修复。
/////////////////////////////////////
我更新的代码。 为类Person
添加bool operator<(const Person* b) const{}
,然后尝试对Person*
的向量进行排序。但结果没有按照我的预期排序,并且没有调用新添加的operator<(const Person*)
。这里有什么建议吗?谢谢
你的错误是没有使用你的调试器一次一行地遍历你的代码,并检查所有变量的值,并检查执行代码的逻辑。使用调试器可以简单地识别此问题,并且知道如何使用调试器是每个C++开发人员所需的技能。 –
@SamVarshavchik,这个问题确实是一个基本的逻辑错误。调试器是好的,但它不是必需的。 –
随着年龄的增长,您随时订购的第一个名字不少于第二个名字 - 包括大的时候。将运算符<更改为if(name == b.name)return age