2011-11-14 160 views
13

我想要一个stl list的对象,其中每个对象包含两个int's。 之后,我想在第一个int的值之后用stl :: sort对列表进行排序。 如何告诉排序功能它应该在第一个int之后排序?排序自定义类型的列表

回答

24

您可以指定自定义排序谓词。

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

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

在老版本的C++,你必须写一个适当的功能:在C++ 11,这是最好用的λ完成

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

thelist.sort(compFirst); 

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

最后,如果这样做有道理,也可以使用operator<装备您的自定义类。这使您可以在任何有序的环境中自由使用该类,但一定要理解其后果。

+0

您好。我使用的是“旧版本”排序,但它保留了一个未排序的元素:原始列表中的最后一个元素没有排序,它始终是最后一个元素。你知道什么可能是错的吗?谢谢 –

+0

@MarcoCastanho:我不认为这会发生。听起来就像你在某个地方有bug。随意发布一个问题;请务必创建一个*最小*再现示例。 –

2

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

+1

'std :: sort'也不能在'std :: list's ... :-( –

+2

@KerrekSB:谢谢。有一天我会追捕那个决定std :: sort不能的人只是专门用于列表迭代器,但必须被合并到类中 – thiton

+0

不要,它没有意义列表排序是完全不同的,并且与迭代器无关标准排序通过*交换值* ,而列表排序利用了容器的本性,并且只是重新绑定了元素节点。注意,列表排序不会*接受迭代器对! –

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()