运算符重载

之前一直搞不太懂自定义比较函数和重载运算符的概念,只会依葫芦画瓢的实现功能,渐渐的觉得这样不太好,虽然细节是魔鬼,但有些东西还是搞明白一点比较好。部分内容

转载自Ohazyi Zone’s blog

sort
自定义比较函数
//示例
struct node{
    int x, y;
};

bool cmp(const node& a, const node& b){
    return a.x > b.x //对x降序排列
}

node d[maxn];

int main(){
    sort(d, d + n, cmp);
    return 0;
}

注:自定义比较函数的形式同样也适用于pair类型数据排序。

重载运算符<
//示例
struct node{
    int x, y;
};

bool operator <(const node& a, const node& b){
    return a.x > b.x; //重载为降序排列
}

node d[maxn];

int main(){
    sort(d, d + n);
    return 0;
}

注:由于sort默认less(升序),所以重载’<’运算符。重载运算符的操作不能用于pair类型数据的排序,只能作用于结构体或类对象。

priority_queue
重载运算符< (运算符重载函数放到结构体外)
struct node{
    int x, y;
};

bool operator <(const node& a, const node& b){
    return a.x > b.x //less默认大顶堆,改为小顶堆
}

//bool operator >(const node& a, const node& b){
//    return a.x < b.x //greater默认小顶堆,改为大顶堆
//}

int main(){
    priority_queue, less > que;
    //priority_queue, greater > que;
    return 0;
}

注:同样重载运算符的操作不能用于pair类型数据的排序,只能作用于结构体或类对象。

重载运算符< (运算符重载函数放到结构体内)
struct node{
    int x, y;
    bool operator <(const node& a) const { //必须加const
        return x > a.x;
    }
    //bool operator >(const node& a) const { //必须加const
    //    return x < a.x;
    //}
};

int main(){
    priority_queue, less > que;
    //priority_queue, greater > que;
    return 0;
}

注:同上。

自定义比较函数

struct node{
    int x, y;
};

struct cmp1{
    bool operator()(node a, node b){
        return a.x > b.x; //小顶堆
    }
}

struct cmp2{
    bool operator()(node a, node b){
        return a.x < b.x; //大顶堆
    }
}

int main(){
    priority_queue, cmp1> que1; //小顶堆
    priority_queue, cmp2> que2; //大顶堆
    return 0;
}

注:同样适用于pair类型数据排序。

其它

set > st; //按照从大到小,默认是less
typedef pair  P;
set

st; //按照pair的第一个元素来排,第一个相等的话按第二个来排 set > st;//按照从大到小的greater来排

注:set、map的自定义比较函数和重载运算符与优先队列priority_queue类似。

你可能感兴趣的:(运算符重载)