Re: [問題] stl priority_queue less<MyClass*> ?

看板C_and_CPP作者時間14年前 (2009/11/26 00:32), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串2/5 (看更多)
※ 引述《LRM (小烏龜)》之銘言: : 問題描述: : 有辦法傳指標給less或greater嗎? : 遇到問題如下: : #include <queue> : using namespace std; : class MyClass{ : public: : MyClass(int i){ x=i; } : int x; : }; : void main(){ : priority_queue< MyClass*, vector<MyClass*>, less<MyClass*> > test; : test.push(new MyClass(1)); : test.push(new MyClass(2)); : while(!test.empty()){ : printf("%d\n", test.top()->x); : test.pop(); : } : return; : } : compiler雖然會過,但明顯不是我要的結果, : 因為我一直無法實作 less<MyClass*> ! : 使用 : bool operator < ( const (MyClass*) & c1, const (MyClass*) & c2){ : return c1->x < c2->x; : } : 無法編譯過,提示error C2803 至少必須擁有一個類別型別的型式參數(VC++) VC++有很多Error講得模糊不清 其實C2803: must have at least one formal parameter of class type. 出現這個錯誤的理由是 根據C++ standard,你不能改變built-in operator的行為! 很不幸的 兩個pointer的operator <是built-in operator MyClass* c1, c2; c1 < c2; // 這是built-in的operator,其意義為比較兩個指標的位址值 所以你要overload它 compile就會呱呱叫說你不能這樣幹 : 目前我的解法如下: : #include <queue> : using namespace std; : class MyClass{ : public: : MyClass(int i){ x = i; } : int x; : }; : class MyClassPtr{ : public: : MyClassPtr(int i){ ptr = new MyClass(i); } : MyClass * ptr; : }; : bool operator > ( const MyClassPtr & c1, const MyClassPtr & c2){ : return c1.ptr->x > c2.ptr->x; : } : void main(){ : priority_queue<MyClassPtr, vector<MyClassPtr>, greater<MyClassPtr>> test; : test.push(MyClassPtr(1)); : test.push(MyClassPtr(2)); : while(!test.empty()){ : printf("%d\n", test.top().ptr->x); : test.pop(); : } : return; : } : 拿MyClassPtr 來包裝MyClass * 確實達到我的需求 : 只是想問有沒有其他簡單的方法? 有,第一個選擇,你可以寫一個functor來取代原本的less<>模板 你忽略的一點是,std::priority_queue的第三個模板參數 只要是能吃進兩個value_type的Binary Predicate就可以了.. (Binary Predicate = functor that accepts two parameter and returns bool) 所以你可以自己寫一個functor當成模板的第三個參數 : 還是我是否有觀念上的不清楚, : 比如說stl容器本身不需要裝指標? 最後一種解法,使用智慧型指標(比如說boost::shared_ptr)來取代原本的指標 因為boost::shared_ptr<MyClass> 是個class type 所以overload operator<(shared_ptr<MyClass>& c1, shared_ptr<MyClass>& c2) 也是合法的 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.32.5.35
文章代碼(AID): #1B3LmKQd (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1B3LmKQd (C_and_CPP)