对自定义类型的列表进行排序

时间:2011-11-14 12:49:53

标签: c++ stl

我希望有一个stl list个对象,其中每个对象包含两个int。 之后我想在第一个int的值之后用stl :: sort对列表进行排序。 如何告诉sort函数它应该在第一个int之后排序?

3 个答案:

答案 0 :(得分:29)

您可以指定自定义排序谓词。在C ++ 11中,最好使用lambda:

typedef std::pair<int, int> ipair;
std::list<ipair> thelist;

thelist.sort([](const ipair & a, const ipair & b) { return a.first < b.first; });

在旧版本的C ++中,您必须编写适当的函数:

bool compFirst(const ipair & a, const ipair & b) { return a.first < b.first; }

thelist.sort(compFirst);

(相反,如果ipair您当然可以拥有自己的数据结构;只需相应地修改比较函数即可访问相关数据成员。)

最后,如果这有意义,您还可以为自定义类配备operator<。这允许您在任何有序的上下文中自由使用该类,但一定要了解其后果。

答案 1 :(得分:3)

std :: list :: sort has a one-argument form,第一个参数是比较函数。

答案 2 :(得分:1)

您可以这样做:

typedef std::pair<int,int>;
list<my_type> test_list;

bool my_compare (my_type a, my_type b)
{
    return a.first < b.first;
}

test_list.sort(my_compare);

如果类型是结构或类,它将工作如下:

struct some_struct{
    int first;
    int second;
};

list<some_struct>  test_list;

bool my_compare (const some_struct& a,const some_struct& b)
{
    return a.first < b.first;
}

test_list.sort(my_compare);

或者您可以为结构定义operator <,然后只需调用test_list.sort()