1. 程式人生 > >關於過載和比較函式

關於過載和比較函式

以下內容都是個人見解,若有錯誤,還望指正!!

最近剛學習了C++中有關過載運算負中的知識,總算明白瞭如何通過過載一些運算子來改變一些容器的排序順序 如 priority_queue優先佇列的優先順序和 sort 函式的二級排序,在不寫比較函式的情況下如何通過過載運算負實現(如果對一個類有多個操作,sort建議還是用比較函式比較好)

//一般比較函式的寫法 
struct Node{
	int a;
	int b;
};
bool compare(const Node x,const Node y){//按 a 的升序排列,如果a相等按 b 的升序;  
	if(x.a == b.a)
		 return x.b < y.b;
	return x.a < y.a; 
}
sort(arr,arr+n,compare);
這裡我們對 < 符合做了過載,因為在一般的排序比較函式中預設的都是使用 < 符合來排序和比較的
//過載的兩種寫法 
struct Node{
	int a;
	int b;
	friend bool operator< (const Node& x,const Node& y)//友元函式的寫法,這裡的變數有2個,和比較函式比較相似好理解 
	{
		if(y.a == x.a)
			return x.b < y.b;
		return x.a > y.a;
	}
};
struct Node{
	int a;
	int b;
	bool operator< (const Node& y)const//這裡就應用到一些運算子過載的知識,不是一兩句話能說清楚的,不懂的自行學習
	// 這裡說說兩個const,第一個是為了保護我們傳的引用不被非法修改(傳引用為了節約開銷,一般的類可能比較複雜)
	//第二個const 是為了修飾 this 指標(C++中一個很有特點的指標,不懂的需要先學習一下),作用與前面的基本一樣 
	{
		if(a == y.a)
			return b < y.b;
		return a > y.a;
	}
};
struct Node{
	int a;
	int b;
	bool operator< (const Node& y)const
	//如果不明白上面說的第二個const,那麼這是一種this指標的寫法,道理和上面的一樣 
	{
		if(this->a == y.a)
			return this->b < y.b;
		return this->a > y.a;
	}
};


下面來說一下priority_queue的過載吧,其實在我轉載的一篇關於優先佇列的使用一文中寫的很詳細

但是當時並不瞭解,只是比劃著用的,現在終於領悟了

值得注意的就是priority_queue預設的是大根堆,對 < 的過載是與我們所期盼的效果相反的(表達能力有限,懂得人應該理解)

struct node    
{    
    int priority;    
    int value;  
	friend bool operator< (node n1, node n2)    
    {    
        return n1.priority < n2.priority;  //"<"為從大到小排列,">"為從小到大排列    
    }      
}; 
//或者用 this 方式的過載,(這裡傳參和傳引用道理同上,const什麼的也是根據C++標準來做的) 
struct node    
{    
    int priority;    
    int value;  
	bool operator< (node n2)    
    {    
        return this->priority < n2.priority;  //"<"為從大到小排列,">"為從小到大排列    
    }      
};