c++ STL中的list容器用sort排序是,如何自定义比较

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c++ STL中的list容器用sort排序是,如何自定义比较相关的知识,希望对你有一定的参考价值。

list提够了sort 函数,但 如果想自己定义大小的比较,该怎样写呢?
如下程序为什么不可以呢?
struct node



bool operator () (const int & i,const int & j)



return i<j;



;

list<int> l;
//在此向l 中插入一些元素
l.sort(node( ));

template<class comp>
void sort(comp cmpfn)

前面写错了,对不起了。

你改成l.sort(int node(const void *a,const void *b));
试试吧,sort函数不只是通过使用bool运算判断大小,它还有判断谁大谁小,int大于0就是a>b,反之就是a<b,等于0就是a==b;
我帮你改写了一下你的node()
int node(const void *a,const void *b)
return *(int *)a - *(int *)b;
参考技术A

1、sort函数的原型之一是:
void sort( iterator start, iterator end, Comp cmp );
其中cmp可以是自定义的函数,按照您指定的规则用于比较迭代器对应的元素的大小。
那么这里的cmp是一个结构体(或者说类)。该类定义了一个调用操作符(就是operator()啦),调用操作符接受两个Node类型对象为参数,返回一个bool值。
那么cmp()是什么呢?它在执行时将创建一个cmp类的临时对象,使用该临时对象调用operator()来比较两个Node对象的大小。
比如比较Node[i]和Node[j],那么cmp()比较它们之间的大小等价于:
cmp ctemp;
temp.operator(Node[i], Node[j])返回一个bool值。
所以说cmp()等价于一个函数对象。

2、例程:

#include <iostream>
#include <algorithm>
#include <functional>
using namespace std;
bool sort_desc(int a, int b)

return a > b;

bool sort_asc(int a, int b)

return a < b;

void p(int* begin, int* end)

while(begin < end)
cout << *begin++ << ' ';
cout << endl;

int main()

int a[] = 6,9,1,3,5,2,7,0,4,8;
sort(a, a + 10, sort_desc);
p(a, a + 10);
sort(a, a + 10, sort_asc);
p(a, a + 10);
sort(a, a + 10, greater<int>());
p(a, a + 10);
sort(a, a + 10, less<int>());
p(a, a + 10);

参考技术B template<class
comp>
void
sort(comp
cmpfn)
前面写错了,对不起了。
你改成l.sort(int
node(const
void
*a,const
void
*b));
试试吧,sort函数不只是通过使用bool运算判断大小,它还有判断谁大谁小,int大于0就是a>b,反之就是a<b,等于0就是a==b;
我帮你改写了一下你的node()
int
node(const
void
*a,const
void
*b)
return
*(int
*)a
-
*(int
*)b;
参考技术C template<class
comp>
void
sort(comp
cmpfn)
前面写错


l.sort(int
node(const
void
*a,const
void
*b));
试试吧
sort函数

使用bool运算判断
判断谁

int
于0
a>b,反
a<b,等于0
a==b;
我帮
改写
node()
int
node(const
void
*a,const
void
*b)
return
*(int
*)a
-
*(int
*)b;

C++ STL中排序算法的工作

【中文标题】C++ STL中排序算法的工作【英文标题】:Working of Sort Algorithm in C++ STL 【发布时间】:2014-01-11 03:00:23 【问题描述】:

从 Sort(begin,end) 的用法看来,只需指定容器的开始和结束索引,该函数就可以对容器进行排序。但我的问题是 sort 函数如何获取容器的类型。

std::sort(myvector.begin(), myvector.end());

从上面的代码我假设开始和结束索引是发送。向量类型和向量名称是怎么推导出来的。

【问题讨论】:

算法不关心容器的类型——只关心迭代器的类型。它需要 RandomAccessIterators,这就是为什么你不能使用 std::sortstd::list 【参考方案1】:

函数std::sort&lt;algorithm&gt; 中的许多其他函数一样,不关心容器类型,因为它适用于概念

具体来说,函数定义为:

template< class RandomIt >
void sort( RandomIt first, RandomIt last );

如您所见,模板用于表达ValueSwappableRandomAccessIterator 迭代器的概念。

【讨论】:

抱歉无法理解,请您详细说明一下 另外,如果它不关心容器类型,排序函数如何比较值。 @krish_oza,阅读模板,然后阅读我在答案中添加的链接。一切都会清楚。【参考方案2】:

myvector.begin()/end() 返回类型“containertype::iterator”

至于 sort() 是如何工作的,它实际上并不关心底层的容器类型,只要容器中的两个元素具有可比性即可(less&lt;type&gt;() 存在于该元素中,或者您指定自己的比较函数)。

【讨论】:

“可比”的要求绝对不是唯一的。 @Jefffrey 还有什么?迭代器是 RandomAccessIterator / 同一个容器中的两个迭代器? 查看我的答案中的链接(特别是 ValueSwappableRandomAccessIterator 要求。

以上是关于c++ STL中的list容器用sort排序是,如何自定义比较的主要内容,如果未能解决你的问题,请参考以下文章

C++ STL中排序算法的工作

C++中 sort 函数的使用详解

《STL源码剖析》——第四章序列容器

C++提高编程STL-list容器

acm学习总结

C++中定义比较函数的三种方法