一、介绍
在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²个和,求这个N2²和中最小的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