前段時間做專案時,遇到自定義優先順序的優先佇列問題,偶偶發現點問題,通過網友的解答和自己的理解明白了一些路路,小結一下:
1、若是定義值型別物件,如:
int main()
return 0;}
則定義優先順序的時候,直接在類中寫個friend 的操作符過載函式即可:
class node
node(int x):a(x){}
friend
bool operator<(const node ne1,const node ne2)//引數也可以為引用,值傳遞
else}};
其中在c++primer第三版 中文版中關於操作符過載有如下描述:
"程式設計師只能為類型別或列舉型別的運算元定義過載操作符我們可以這樣來實現把重
載操作符宣告為類的成員或者宣告為名字空間成員同時至少有乙個類或列舉型別的引數
按值傳遞或按引用傳遞"
因此不可用指標型別的引數;
2、如果想定義乙個指標型別的優先佇列,那就不可這麼簡單的定義了,你需要自定義乙個自己的比較函式,在priority_queue的模板函式中,我們可以利用這樣乙個template, class _pr = less>模板,在我們的程式**中,則需要自己定義乙個類來定義第三個模板引數,如:
class nodepointercomparer
bool operator ()(const node* ne1, const node* ne2) const
}; 當然在這之前我們的類node要重新書寫:
class node
node(int x):a(x){}
bool lessthan(const node* pnode) const
}; 這樣在main函式中就可以定義指標型別的優先佇列了:
int main()
return 0;
}
疑問之處:如果你使用第一種值傳遞的操作符過載,來實現第二種的指標型別優先佇列,是不會達到想要的結果的,個人理解是因為在指標型別的優先佇列中找「<」運算子的時候,過載的不是我們寫的值傳遞friend
bool
operator<(
const
node ne1,
const
node ne2)//
也就是沒有找到指標型別的"<"過載,所有不會達到優先佇列的效果。
最後的一段為個人理解,有錯誤之處,還請路過的同仁指教。
《優先佇列》使用及操作符過載 C
c 優先佇列 include 在結構體中定義乙個 friend bool operator node n1,node n2 return n1.elem n2.elem 這是根據node結構體中的elem公升序構建的乙個操作符 如果想要降序就把 換成 priority queueq 其中node為結...
C 自定義比較 仿函式 函式與過載操作符
cpp 比 c 方便不少不光因為其支援物件導向支援class,同樣還因為其支援泛型程式設計,有方便的stl庫。泛型要比巨集強大的多,是一種設計更巧妙的編譯期動態機制,型別安全,使得一些通用演算法的封裝變得十分方便。模板操作的是型別,特化的時候編譯器會做型別推導,這是模板乙個核心特徵。根據c 標準,當...
過載前置操作符和後置操作符
i i的值作為返回值,i自增1 i i自增1,i的值作為返回值 現代編譯器產品會對 進行優化 優化使得最終的二進位制程式更加高效 優化後的二進位制程式丟失了c c 的原生語義 不可能從編譯後的二進位制程式還原c c 程式 操作符可以被過載 全域性函式和成員函式均可以進行過載 過載前置 操作符不需要額...