2012-08-24 31 views
-1

發現錯誤我:不能使用set_difference算法

「object.h」

namespace objectNS 
{ 
    class object 
    { 
    public: 
     int m_number; 
     bool operator== (const object& object) const; 
     bool operator< (const object& object) const; 
    }; 
    class compare 
    { 
    public: 
     bool operator()(const object*, const object*) const; 
    }; 
} 

「object.cpp」

#include "object.h" 
typedef objectNS::object OBJECT; 
bool OBJECT::operator== (const object &object) const 
{ 
    return this->m_number == object.m_number; 
} 

bool OBJECT::operator< (const object &object) const 
{ 
    return this->m_number < object.m_number; 
} 

bool objectNS::compare::operator() (const object* obj1, const object* obj2) const 
{ 
    return obj1->m_number > obj2->m_number; 
} 

我得到了一些功能它與物體一起使用,

void f(void) 
{ 
    set<Compound_object*> detectedObjects; 
    set<Compound_object*> deleteFromTrackedObjects; 
    set_difference(detectedObjects.begin(), detectedObjects.end(), this->m_trackedObjects.begin(), this->m_trackedObjects.end(), inserter(addToTrackedObjects, addToTrackedObjects.end())); 
} 

問題描述: 我實現operator<operator==通過兩個實例的對比,進行m_number,但是當集detectedObjectstrackedObjects包含具有相同m_number元件時,std::set_difference返回所有按預期方式使用元素而不是空結果集。

我甚至試圖給功能對象compare作爲模板參數,但因此我得到了很多關於=!=沒有正確定義的編譯器錯誤。

我不知道是什麼問題?

+0

請張貼代碼,我們可以編譯('m_number' vs'm_numberOfObject','this'在一個非成員函數中),但保持最小值(什麼是「比較」)。正確縮進。 – avakar

+2

可能有一些難以理解的typedefs參與,但從您的聲明,似乎你的集包含_pointers_對象,而不是對象本身。在這種情況下,作爲對象類的一部分定義的'operator <'不會生效。 – jogojapan

+0

@ jogojapan,是的,謝謝,聽起來很合理,我沒有注意到它。所以我需要將適當的類定義爲比較器並將它作爲set的參數進行聲明?但是,當我試圖將我的比較類作爲參數提供給集合時,我得到那些「=」,「!=」而不是定義的原因是什麼? –

回答

2

我不明白爲什麼你要存儲指向對象的指針而不是對象本身。

要使用一個比較,你需要確保你提供相同的比較類型所有的實例集set_difference

set<Compound_object*, compare> m_trackedObjects; 

set<Compound_object*, compare> detectedObjects; 
set<Compound_object*, compare> deleteFromTrackedObjects; 
set_difference(detectedObjects.begin(), detectedObjects.end(), 
    this->m_trackedObjects.begin(), this->m_trackedObjects.end(), 
    inserter(addToTrackedObjects, addToTrackedObjects.end()), 
    compare()); 
+0

ecatmur,非常感謝你的詳細和聰明的解釋,現在代碼編譯和按預期工作!問題是:我在集合中包含了comp funct對象作爲參數,但我忘記將它作爲參數包含在算法set_difference中。所以再次感謝,祝你有美好的一天! –