stl中各种容器的自定义比较函数

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

class elem
{
public:
	elem();
	elem(int aa):a(aa){}
public:
	int a;
	int getA()
	{
		return a;
	}
};


class elem1
{
public:
	elem1();
	elem1(int aa):a(aa){}
public:
	int a;
	int getA()
	{
		return a;
	}

	friend bool operator < (const elem1 &e1,const elem1 &e2)//只能重载<
	{
		return e1.a <e2.a;//大顶堆是<;小顶堆是>
	}
};

class Scorer
{
public:
	bool operator ()(const elem &e1,const elem &e2)
	{
		return e1.a<e2.a;
	}
};
bool Cmp(const elem &e1,const elem &e2)
{
	return e1.a <e2.a;
}
int main()
{
	vector<elem> ve;
	ve.push_back(elem(5));
	ve.push_back(elem(6));
	ve.push_back(elem(7));
	ve.push_back(elem(1));
	ve.push_back(elem(0));
	ve.push_back(elem(19));
	ve.push_back(elem(60));
	ve.push_back(elem(61));
	ve.push_back(elem(2));
	ve.push_back(elem(68));
	ve.push_back(elem(9));

	list<elem> le;
	le.push_back(elem(5));
	le.push_back(elem(6));
	le.push_back(elem(7));
	le.push_back(elem(1));
	le.push_back(elem(0));
	le.push_back(elem(19));
	le.push_back(elem(6));
	
	priority_queue<int,vector<int>,less<int> > pq;//大顶堆//优先队列如果用仿函数的形式,必须有三个参数
	pq.push(5);
	pq.push(6);
	pq.push(1);
	pq.push(2);
	pq.push(9);
	/*while (!pq.empty())
	{
		int t = pq.top();
		cout<<t<<" ";
		pq.pop();
	}*/
	
	priority_queue<elem,vector<elem>,Scorer > q;//1.自定义仿函数,也要有三个参数
	q.push(5);
	q.push(6);
	q.push(1);
	q.push(2);
	q.push(9);
	
	priority_queue<elem1> q1;//2.
	q1.push(5);
	q1.push(6);
	q1.push(1);
	q1.push(2);
	q1.push(9);

	set<int,less<int> > s;//从小到大
	s.insert(5);
	s.insert(6);
	s.insert(1);
	s.insert(3);
	s.insert(0);

	set<elem,Scorer> s1;

	s1.insert(5);
	s1.insert(6);
	s1.insert(1);
	s1.insert(3);
	s1.insert(0);
	set<elem,Scorer >::iterator it;
	for (it = s1.begin();it!=s1.end();++it)
	{
		cout<<it->getA()<<" ";
	}


	/*while(!q1.empty())
	{
		elem1 e = q1.top();
		cout<<e.getA()<<" ";
		q1.pop();
	}*/
	
	int array[] = {5,6,7,1,0,19,6};
	sort(array,array+7,greater<int>());//less<int>() 从小到大//说明greater,less和Scorer一样都是类,而Cmp是函数;所以vector还是用Cmp形式的函数比较方便
	/*for (int i=0;i<7;++i)
	{
		cout<<array[i]<<" ";
	}
	cout<<endl;*/

	//sort(ve.begin(),ve.end(),Scorer());//sort(ve.begin(),ve.end(),Cmp);
	//partial_sort(ve.begin(),ve.begin()+3,ve.end(),Cmp);//对前三个排序
	nth_element(ve.begin(),ve.begin()+3,ve.end(),Cmp);//保证前三个最小,前三个不排序
	//sort(le.begin(),le.end(),Cmp);
	le.sort(Scorer());//Cmp//list的排序是要移动其内部指针的,所以只能用其内部的sort,而不能用通用的sort//也不能用nth_elements之类的排序
	
	
	/*vector<elem>::iterator it;
	for (it = ve.begin();it!=ve.end();++it)
	{
		cout<<it->getA()<<" ";
	}*/
	cout<<endl;


	
}

stl中各种容器的自定义比较函数的方法,vector,list,set相类似,要定义一个比较类,类里面有比较成员函数 bool operator ()(const,const),并且return a<b 是从小到大排序

priority_queue有些不同,主要表现在return a<b是大顶堆


所有的共同之处是,都可以通过定义一个比较类实现排序




自定义比较函数(sort,priority_queue) sort 头文件 &amp;lt;algorithm&amp;gt; sort函数可以不使用参数进行排序,即 sort(a,a+n); 这种排序是一种升序排序,想要自定义排序方式,则需要改写sort函数的参数 例: int a[N]; bool cmp(int a,int b) { return a&amp;gt;b; } sort(a,a+n,cmp); 这种排序的结果是一种降序排序,在该例中自定义cmp参... 阅读详情

相关推荐

c++如何自定义比较函数

本文探讨了在 C++ 中创建和使用自定义比较函数的多种方法,包括使用函数对象(Functors)、Lambda 表达式、标准库比较函数、普通函数以及重载 < 运算符。每种方法都适用于不同的场景,使得数据的排序和组织更加高效和直观。理解这些技术对于增强代码灵活性和解决复杂问题至关重要。本文为初学者和有经验的开发者提供了深入了解自定义比较逻辑在 C++ 编程中应用的基础。

m0_51661400的博客 3993

C++ 当中的自定义比较

sort的第三个参数必须是可调用的实例,一般是函数指针boolcmp(类型a,类型b){returnsort(v,begin(),v.end(),cmp)或sort(v,begin(),v.end(),&cmp)setmap的排序参数必须是类型。

2301_79647020的博客 1160

关于STL内的比较函数

STL的关联容器中,内部的元素是排序的。STL中的许多算法,也会牵涉到排序、查找。这些容器和算法都需要对元素进行比较,有的比较是否相等,有的比较元素大小。在STL中,默认的情况是,比较大小是用“"运算符无关。 在STL中提到”大“、”小“的概念的时候,以下三个说法是等价的: (1)x 比 y 小 (2)表达式”x (3)y 比 x 大 一定要注意,“y 比 x 大” 意味着 “ ”x

魏莘墨的专栏 1277

总结C++自定义比较函数(算法:sort,容器:priority_queue、map、set)

2020年9月10日 周四 天气晴 【不悲叹过去,不荒废现在,不惧怕未来】 题外话:今天是教师节,祝天下所有的老师节日快乐~~ 本文目录 在使用STL中很多涉及比较函数(比如:sort、priority_queue、map、set)的时候,我们都可以自定义比较函数,具体来说大致有下面几种方法: 对一个自定义的 struct 重写它的 operator < 方法 定义一个 cmp 函数 定义一个 cmp 结构体对象 lambda表达式 ...

m0_37433111的博客 9169

define定义的函数如何引用_技术专栏-C++ 第一篇 STL容器如何自定义比较函数

第一节 常见容器自定义比较函数示例容器的排序:容器的使用过程中,经常涉及到排序,对于比较函数的定义如果大家没有使用过,就会问,需要自己定义吗?怎么定义?有没有现成的?哪些容器需要?等等。本文主要帮助大家解决此疑惑,一方面是总结,一方面是教大家如何通过源码来找到定义。容器的分类:序列式容器(随机迭代器):vector, list, deque关联式容器(非随机迭代器):set, map, multi...

weixin_39915694的博客 198

C++ STL无需容器自定义哈希函数比较规则

而当无序容器中存储的是用结构体或类自定义类型的数据时,自定义哈希函数的方式只有一种,即使用函数对象类的形式;而自定义比较规则的方式有两种,要么也以函数对象的方式,要么仍使用默认的std::equal_to<key>规则,但前提是必须重载==运算符。当无序容器中存储的是基本类型(int、double、float、string)数据时,自定义哈希函数比较规则,都只能以函数对象类的方式实现。

hfbgx的博客 383

C++ STL set自定义比较函数

C++ STL 容器很多都可以自定义比较函数,给容器调用,对其中的子项做排序。下面是一个小例子: [cpp] view plaincopy #include    #include    #include       using namespace std;      class CTest {   public:        

MyDriverC 5084

sort函数_实战经验:自定义函数STL比较函数sort中的使用

STL库中有自带的排序函数族,今天就来讲讲其中比较常用的sort函数。该函数可以对容器进行排序,比如如下的代码:经过上述sort调用之后,容器中的数据内容为升序排列:1, 3, 5, 6我们可以定义比较函数来制定排序规则,具体代码如下:降序排列(从大到小):升序排列(从小到大):在上面的例子代码中,出现了第三个实参,这个实参是一个用户自定义比较函数。该函数返回为bool类型,参数为两个元素(这里...

weixin_39563823的博客 203

C++编程法则356天一天一条(179)自定义容器比较函数

C++自定义比较函数指南摘要: C++中自定义比较函数可通过普通函数函数对象、Lambda表达式和成员函数指针实现,用于控制排序、搜索等算法及容器的行为。常见应用场景包括结构体排序、STL算法和优先队列。关键注意事项包括满足严格弱序规则、使用常量引用优化性能。进阶技巧涉及多字段比较、参数化比较STL预定义比较器结合。不同容器(如set/map/priority_queue)的比较函数用法各异,合理使用可灵活实现复杂逻辑。遵循规范可确保代码高效且正确。

二进制君 904

mysql 自定义哈希函数_C++ STL无序容器自定义哈希函数比较规则(超级详细)...

前面在讲解 unordered_map、unordered_multimap、unordered_set 以及 unordered_multiset 这 4 种无序关联式容器(哈希容器)时,遗留过一个共性问题,即如何给无序容器自定义一个哈希函数比较规则?注意,虽然每种无序容器都指定了默认的 hash 哈希函数和 equal_to 比较规则,但它们仅适用于存储基本类型(比如 int、double、...

weixin_34832594的博客 479

STL学习(二)set容器学习(二)-自定义比较函数

#include #include using namespace std; typedef struct { int a,b; char s; }newtype; struct compare { bool operator()(const newtype &a, const newtype &b) const { return a.s<b.s; } }; se

gundanseed的专栏 878

自定义compare 函数

//priority queue 可以用自定义的compare类struct compare { bool operator()(const int& l, const int& r) { return l > r; } }; int main(){    priority_queue<int,vec...

disizhangcu065587的博客 433

STL自定义排序函数:sort()函数;priority_queue,set,map等容器排序函数

1、sort()函数自定义排序: 1.1、sort()模板原型: 1.1.1、默认模板:利用<比较,升序排列 template <class_Randlt> // 模板参数为迭代器类型 void sort(_Randlt first, _RandIt last); // 参数为起止随机访问迭代器 前提是a、b (_Randlt迭代器指向的对象) 必须可比较大小。元素比较大小是用<进行的,如果表达式a<b的值为 true,则 a 排在 b 前面。 a,b为值对象:可直接比较

个人工作中学到的专业技术与职业发展知识笔记 1439

stl 实现非容器类型元素和容器元素比较

std::lower_bound。

leizhengshenglzs的博客 561

STL 比较

STL还提供了一些预定义的比较器,例如。

Ricardo的博客 373

STL:set中使用自定义比较操作

set关联容器对关键字类型有一些限制,关键字类型必须定义比较操作,默认情况下,标准库使用关键字类型的<运算符来比较两个关键字。当关键字类型是用户自定义类型时,为了容器中关键字类型正确,我们有三种方式提供正确的关键字类型。 第一中方式:在关键字类型中对#include #include using namespace std; class Node { public: int star

yang20141109的专栏 2665

C++ STL set容器常用用法

set是STL中一种标准关联容器。它底层使用平衡的搜索树——红黑树实现,插入删除操作时仅仅需要指针操作节点即可完成,不涉及到内存移动和拷贝,所以效率比较高。set,顾名思义是“集合”的意思,在set中元素都是唯一的,而且默认情况下会对元素自动进行升序排列,支持集合的交(set_intersection),差(set_difference) 并(set_union),对称差(set_symmetri...

Low Coder的博客 3万+

C++仿函数stl标准库的比较问题)

所谓仿函数相当于C#中的delegate,应该说delegate是把这个功能另外抽象了出来,便于区分。 在stl标准库的容器中,如map型,经常会需要用到自定义的或者非基本类型的对象作为key,但是插入的时候需要对key进行比较,c++自身没有比较功能,就需要实现一个仿函数(委托)来告诉stl容器这些东西应该怎么比较。 仿函数其实是一个类,类中重载了一些已经指定好了的成员函数(就像指定结构的

yhf_szb的专栏 461
上一篇: stl 容器
下一篇: 全排列
sunmenggmail
博客等级 码龄17年 955粉丝 302原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值