C++ STL set的自定义去重

本文介绍了在C++中通过两种方式为set自定义去重规则:1) 重载结构体的`<`操作符;2) 创建自定义比较类并重载`()`运算符。这两种方法使得set在插入重复元素时能根据特定条件判断是否重复,从而实现去重功能。示例代码展示了如何通过这两种方法实现按特定规则(例如降序)进行去重。
摘要由CSDN通过智能技术生成

set自定义去重有两种方法(map也类似):

1,重载<比较符

将set的元素类型如struct Node中的operator <()函数重载,保证对相同的元素始终返回false即可,示例代码如下:

#include <iostream>
#include <set> 
 
using namespace std;
 
struct Node{
	int id,value;
	Node(){}
	Node(int _id,int _value):id(_id),value(_value){}
	bool operator < (const Node& b)const {
		if(id == b.id)return false;//去重
		//降序
		if(value != b.value)return value > b.value; 
		else return id > b.id;
	}
};
 
int main(){
	
	set<Node> S;
	S.insert(Node(1,2));
	S.insert(Node(2,3));
	S.insert(Node(2,4));//插入失败 
	S.insert(Node(3,4));
	for(auto it=S.begin() ; it!=S.end() ; ++it)
		printf("id:%d value:%d\n",(*it).id,(*it).value);
	return 0;
}
2,重载( )运算符

新建一个MyComparator类,在该类中重载( )运算符函数,保证对相同的目标元素类型始终返回false,之后在初始化新的该set时于<>内加上该类,如set<Node, MyComparator>即可,示例代码如下:

#include <iostream>
#include <set> 
 
using namespace std;
 
struct Node{
	int id,value;
	Node(){}
	Node(int _id,int _value):id(_id),value(_value){}
	/*
	bool operator < (const Node& b)const {
		if(id == b.id)return false;//去重
		//降序
		if(value != b.value)return value > b.value; 
		else return id > b.id;
	}
	*/
};

struct MyComparator{
	bool operator() (struct Node a, struct Node b){
		if(a.id == b.id)return false;//去重
		//降序
		if(a.value != b.value)return a.value > b.value; 
		else return a.id > b.id;
	} 
};

int main(){
	
	set<Node, MyComparator> S;
	S.insert(Node(1,2));
	S.insert(Node(2,3));
	S.insert(Node(2,4));//插入失败 
	S.insert(Node(3,4));
	for(auto it=S.begin() ; it!=S.end() ; ++it)
		printf("id:%d value:%d\n",(*it).id,(*it).value);
	return 0;
}

可知第二种方法更具通用性,可以创建多个不同的Comparator类以满足不同的比较要求。

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值