Re: [問題] stl priority_queue less<MyClass*> ?
※ 引述《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
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 5 篇):