如何使用成员作为C ++中的键对矢量元素进行排序

时间:2010-06-08 16:10:12

标签: c++ sorting vector

假设我们有

vector<student> allstudent

现在我想用不同的成员对学生进行排序,例如姓名,年龄,地址等。

我该怎么做?

5 个答案:

答案 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/