自定義結構體是做題必須要學會的,而且經常需要用到自定義其排序規則。
優先佇列也是,對於基本資料型別來說,不用自定義優先規則,但是對於自定義資料型別來說,確實是需要自己定義其內部的排序規則的。
今天發現原來兩者的定義規則可以使用同一種方式來定義。
struct node
node
(int xx,
int yy):x
(xx),y
(yy)
bool
operator
<
(const node &b)
const
};
定義了結構體node,裡面有兩個變數x,y,並且定義了乙個建構函式
node
(int xx,
int yy):x
(xx),y
(yy)
這樣可以在使用時,不用先申請在再使用了,可以直接使用。
其中包含了自定義排序規則的部分
bool
operator
<
(const node &b)
const
意為,先按照x從大到小排序,再按照y從大到小排序。
示例
#include
using
namespace std;
struct node
node
(int xx,
int yy):x
(xx),y
(yy)
bool
operator
<
(const node &b)
const};
vector ans;
intmain()
//執行結果41
3629
1511
可以發現,排序結果是按照x從大到小,x相同時,按照y從大到小進行排序的。
那麼既然排序規則定義在了裡面,如果還想讓資料按照別的順序進行排序怎麼辦?要在結構體裡面再寫乙個運算子過載嗎?其實,雖然已經在結構體內部寫好了排序規則,這樣在排序時,不用再新增第三個自定義的排序規則了,但是其實還是可以再在結構體外部寫新的排序規則。
示例
#include
using
namespace std;
struct node
node
(int xx,
int yy):x
(xx),y
(yy)
bool
operator
<
(const node &b)
const};
vector ans;
//在結構體外部定義了新的排序規則
//先是按照x從小到大,若x相同,按照y從小到大
bool
cmp(node &a,node &b)
intmain()
//執行結果15
3034
5357
可以看到,這次雖然在結構體裡面已經定義了乙個排序規則了,又在結構體外面定義了規則,在使用sort進行陣列的排序時,是按照結構體外面的cmp定義的規則進行排序的。是可以的
#include
using
namespace std;
struct node
node
(int xx,
int yy):x
(xx),y
(yy)
bool
operator
<
(const node &b)
const};
priority_queue q;
intmain()
return0;
}//執行結果08
1436
4046
可以看到,其在結構體內的優先順序定義方法和上述的用於結構體陣列排序時的方法是一致的。
之前我在使用優先佇列的優先順序定義時,使用的是下述**
struct node
node
(int xx,
int yy):x
(xx),y
(yy)
friend
bool
operator
<
(const node &a,
const node &b)
}
現在可以統一起來,只用使用第乙個就好了。 結構體運算子過載
c 中,結構體是無法進行 這些操作的,這也帶來了很多不方便的地方,尤其是在使用stl容器的時候,如果我們可以往語句中傳入結構體,一些事情將會變得很簡單。比如二分查詢,binary crearch只能對陣列進行查詢,如果是結構體陣列的話,它會報錯。但很可惜,實際程式設計中,大部分時候操作物件是結構體陣...
結構體的運算子過載
1 定義結構體 structcurrency 2 過載io輸出操作,在結構體內部將輸入操作的過載定義為友元函式過載 friendostream operator ostream out,currency value 在結構體外部進行具體定義 ostream operator ostream out,...
優先佇列的過載運算子
大家都知道 優先佇列是個好東西 但它怎麼如同sort一樣 自定義比較方式呢 這裡就獻上幾種 first 如果物件是int stl預設是大根堆 只需要priorityq priority,greater q 它就能搖身變為小根堆 so easy 過 secondly 重點是結構體的過載 隆重推出 op...