2014-04-26 114 views
0

我有一個泛型類基礎:從基本檢查元素是否是存在於載體

class Basic 
{ 
public: 
    Basic(string name): name(name){} 
    string Name() {return name;} 
private: 
    string name; 
}; 

class Basic2: public Basic 
{ 
public: 
    Basic(string name, int value): Basic(name),value(value){} 
    string Name() {return name;} 
private: 
    string name; 
    int value; 
}; 
class Basic3: public Basic 
{ 
public: 
    Basic(string name, string value2): Basic(name),value2(value2){} 
    string Name() {return name;} 
private: 
    string name; 
    string value2; 
}; 

其他三個類繼承,但具有不同的功能(我們姑且稱之爲Basic1,Basic2,Basic3)。 我有一個基本的向量:vector<Basic*> v

我知道如何在向量中插入元素。但我想檢查元素是否存在,並只在不存在時才插入。我認爲我不能用==比較像Basic1和Basic2這樣的不同類型?怎樣才能檢查我想插入的元素是否存在於矢量中? `

+2

ü se ['std :: find_if'](http://en.cppreference.com/w/cpp/algorithm/find),指定「相等」標準(你沒有在你的問題中列出) – juanchopanza

+0

和don不使用矢量。使用一個向量>或向量>。 –

+2

@RichardHodges:你怎麼知道這個矢量擁有自己的語義? – Deduplicator

回答

-2

您可以檢查對象的typeid

typeid(NewObject) == typeid(myVector[i]) 

看到這個reference

+1

-1這不是正確的答案,並沒有解決被問到的問題。 –

+0

@RemyLebeau:「我假設我無法將類似Basic1和Basic2的不同類型與==進行比較?」是問題的一部分,不是嗎?我不認爲我完全錯誤地說,這些問題的可能解釋之一就是:我能爲每種類型添加一個實例嗎? –

+0

如果你想檢查給定的特定類類型的實例是否存在,通常使用'dynamic_cast'而不是'typeid',特別是如果你還需要訪問類特定的成員。 –

2

如果你想檢查一個給定Base例如已經存在,你可以使用std::find()去尋找Base*指針(是的,這一點也適用後裔):

Base *b = ...; 
if (std::find(v.begin(), v.end(), b) == v.end()) 
    v.push_back(b); 

如果你想檢查一個給定Base內容已經存在,你可以使用std::find_if()代替:

struct MatchesBase 
{ 
    Base *_b; 
    MatchesBase(Base *b) : _b(b) {} 
    bool operator()(const Base *b) const 
    { 
     // compare b to _b as needed... 
     // return true if matches, else false 
    } 
}; 

Base *b = ...; 
if (std::find_if(v.begin(), v.end(), MatchesBase(b)) == v.end()) 
    v.push_back(b); 
+0

但它意味着我必須爲每個從Base繼承的方法做到這一點。而如果我重載了運算符==,那麼類型是不同的,否則我會返回false,否則我會在元素之間進行真正的比較? – anothertest