检查向量中是否存在元素

时间:2014-04-26 20:09:09

标签: c++ inheritance vector polymorphism

我有一个泛型类Basic:

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;
};

其他三个类继承自Basic但具有不同的功能(让我们称它们为Basic1,Basic2,Basic3)。 我有一个基本的矢量:vector<Basic*> v

我知道如何在向量中插入元素。但我想检查元素是否存在,只有在不存在的情况下插入元素。我假设我无法比较不同的类型,如Basic1和Basic2与==?检查我想要插入的元素是否存在于向量中的方法是什么? `

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分:-2)

您可以检查对象typeid

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

请参阅此reference