如何按名称,年龄和分数对所有三个字段
进行排序 #include <string>
#include <vector>
#include <algorithm>
struct student_t
{
std::string name;
int age, score;
};
bool by_more_than_1_field( student_t const &lhs, student_t const &rhs )
{
// sort by name, age and score
}
int main()
{
std::vector< student_t > students;
// populate students
std::sort( students.begin(), students.end(), by_more_than_1_field );
}
答案 0 :(得分:7)
我会这样写:
bool by_more_than_1_field( student_t const &lhs, student_t const &rhs )
{
return lhs.name < rhs.name ||
lhs.name == rhs.name && lhs.age < rhs.age ||
lhs.name == rhs.name && lhs.age == rhs.age && lhs.score < rhs.score;
}
这将允许您按顺序按名称,年龄和分数对记录进行排序。改变优先事项应该是一个简单的练习。
答案 1 :(得分:5)
你必须小心你的排序标准是可传递的:如果x'y则y!&lt; X。 如果它不是传递的,则排序操作结果取决于调用之前数组的顺序,这可能是您不想要的。
bool by_more_than_1_field( student_t const &lhs, student_t const &rhs )
{
if (lhs.name < rhs.name)
return true;
else if (rhs.name < lhs.name)
return false;
else // name equals.
if (lhs. age < rhs. age )
return true;
else if (rhs. age < lhs. age )
return false;
else // age and names equals
return lhs.score < rhs.score;
}
答案 2 :(得分:0)
bool by_more_than_1_field( student_t const& lhs, student_t const& rhs )
{
if( lhs.name < rhs.name )
return true;
else if( lhs.age < rhs.age )
return true;
else if( lhs.score < rhs.score )
return true;
return false;
}
比其他人更容易维护,也更清洁!
答案 3 :(得分:-1)
#include <string>
#include <vector>
#include <algorithm>
struct student_t
{
std::string name;
int age, score;
};
bool by_more_than_1_field( student_t const &lhs, student_t const &rhs ){
if(lhs.name ==rhs.name && lhs.age < rhs.age) return lhs.score<rhs.score;
if(lhs.name==rhs.name) return lhs.age<rhs.age;
return lhs.name<rhs.name;
}
说明:
制作矢量并应用排序函数时,将此函数作为参数传递
恩。 vector<strudent_t> st;
然后进行排序sort(st.begin(),st.end(), by_more_than_1_field)
这将做的是该函数接受类student_t的两个const参数。它接受const,因此对象student_t不可修改。然后按功能给出比较。