重载运算符详解

一、介绍

        在C++中,我们可以重载大多数的运算符。运算符重载是一种使得运算符能够以用户定义的方式工作的机制。这意味着我们可以为用户定义的数据类型更改运算符的行为。

二、用法

        如果要重载一个运算符,需要提供一个函数定义,它将使用关键字operator和你想要重载的运算符符号。这个函数可以是一个成员函数,也可以是一个非成员函数。如果你想要改变赋值运算符、下标运算符、函数调用运算符或者类成员访问运算符的行为,那么你必须将这些运算符作为成员函数重载。

三、示例

        请注意,本篇博客所有重载运算符的操作均在结构体内进行。

        首先,我定义了一个结构体,并将它初始化:

struct node{
	int x,y,sum;
	node(int _x,int _y,int _sum){
		x=_x,y=_y,sum=_sum;
	}
	//结构体初始化
};

        然后是重载运算符。此处有两种方法

        第一种方法

friend bool operator<(node a,node b) {
		return a.sum>b.sum;
} 

        ·这种方法是使用友元函数实现的。它获取两个节点对象a和b,并比较它们的和成员变量。如果a的和大于b的和,则返回true;否则,返回false。

        第二种方法

bool operator<(const node& a) const{ 
		return sum>a.sum;
}

        这种方法是使用后成员函数实现的。它获取对另一个节点对象a的常量引用,并将其sum成员变量与当前对象的sum进行比较。如果当前对象的和大于a的和,则返回true;否则,返回false。

四、题目

        序列合并

                描述

        有两个长度都是N的序列A和B,在A和B中各取一个数相加可以得到N²个和,求这个N​2​²和中最小的N个。

                AC代码

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll N=1e5+2;
struct node{
	int x,y,sum;
	friend bool operator<(node a,node b) {
		return a.sum>b.sum;
	} 
	
};
priority_queue<node>q;
map<pair<ll,ll>,ll> mp;
ll a[N],b[N],sum[N];
ll n;
int main(){
	scanf("%lld",&n);
	for(int i=1;i<=n;i++){
		scanf("%lld",&a[i]);
	}
	for(int i=1;i<=n;i++){
		scanf("%lld",&b[i]);
	}
	sort(a+1,a+1+n);
	sort(b+1,b+1+n);
	q.push({1,1,a[1]+b[1]});
	while(n--){
		int x=q.top().x,y=q.top().y;
		cout<<q.top().sum<<" ";
		q.pop();
		if(mp[{x+1,y}]==0){
			q.push({x+1,y,a[x+1]+b[y]});
			mp[{x+1,y}]++;
		}
		if(mp[{x,y+1}]==0){
			q.push({x,y+1,a[x]+b[y+1]});
			mp[{x,y+1}]++;
		}
	}
	return 0;
}

                思路

          首先,我们定义了一个结构体node,其中包含三个成员:x、y和sum。我们重载了小于运算符,使得当一个节点的sum值大于另一个节点的sum值时,返回真。这样,我们就可以很方便的对数据进行操作。

        本题详解请见本人的上一篇博客https://blog.csdn.net/bhdwyl/article/details/132949125

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值