假设我们有
vector<student> allstudent
现在我想用不同的成员对学生进行排序,例如姓名,年龄,地址等。
我该怎么做?
答案 0 :(得分:26)
创建一个仿函数来比较正确的字段,然后在排序时指定仿函数:
struct by_age {
bool operator()(student const &a, student const &b) const {
return a.age < b.age;
}
};
struct by_name {
bool operator()(student const &a, student const &b) const {
return a.name < b.name;
}
};
// sort by age
std::sort(students.begin(), students.end(), by_age());
// sort by name
std::sort(students.begin(), students.end(), by_name());
从C ++ 11开始,您可以使用lambda表达式“就地”进行比较,如下所示:
// sort by name:
std::sort(students.begin(), students.end(),
[](student const &a, student const &b) {
return a.name < b.name;
});
// sort by age:
std::sort(students.begin(), students.end(),
[](student const &a, student const &b) {
return a.age < b.age;
});
答案 1 :(得分:8)
这有两种简单的方法:
bool operator <(const student &lhs, const student &rhs)
{
return lhs.age < rhs.age;
}
std::sort(allstudent.begin(), allstudent.end()); // sorts by age
或者写一个比较函数:
bool cmp(const student &lhs, const student &rhs)
{
return lhs.age < rhs.age; // here go your sort conditions
}
std::sort(allstudent.begin(), allstudent.end(), cmp); // also sorts by age
答案 2 :(得分:8)
std::sort(students.begin(), students.end(),
[](student const& stud1, student const& stud2) -> bool
{
return stud1.name() < stud2.name();
});
或者,如果您无法访问带有lambda语句的编译器:
std::sort(students.begin(), students.end(),
boost::bind(&student::name, _1) < boost::bind(&student::name _2));
或者做Coffin的方式。当你不得不这样做时,我倾向于避免使用标准算法......虽然我很懒。
答案 3 :(得分:3)
除了之前的评论,您还可以定义多维过滤器,如下所示:
bool operator <(const student &a, const student &b)
{
return ((a.age < b.age) ||
((a.name < b.name) && (a.age == b.age)) ||
((a.address <= b.address) && (a.name == b.name) && (a.age == b.age)))
}
就像上面的操作符一样,如果需要,您可以制作更高级的过滤器。
答案 4 :(得分:0)
一般来说,boost :: multi_index提供了很多这方面的功能。如果您需要快速访问多个密钥,这将特别有用。这个答案不会帮助你做作业;-) 见http://www.boost.org/