检查向量中是不是存在元素[重复]

Posted

技术标签:

【中文标题】检查向量中是不是存在元素[重复]【英文标题】:Check if an element is present in a vector [duplicate]检查向量中是否存在元素[重复] 【发布时间】:2014-04-26 20:09:09 【问题描述】:

我有一个通用类 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 等不同类型与 == 进行比较?检查向量中是否存在我要插入的元素的方法是什么? `

【问题讨论】:

使用std::find_if,指定“平等”标准(您没有在问题中列出。) 并且不要使用向量。使用矢量> 或矢量>。 @RichardHodges:你怎么知道这个向量有拥有语义? 为什么我不能使用vector @rusol 如果是这种情况,则链接的重复潜在客户可能很适合您正在尝试的内容,尽管可能需要进行一些按摩才能满足您的特定需求。一种或另一种方式,您的元素需要实现“身份”的概念才能与另一种进行比较,无论是通过虚拟方法返回比较或其他方式。无关:了解const 参考的用途。 【参考方案1】:

如果您想检查给定的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);

【讨论】:

但这意味着我必须对从 Base 继承的每个方法都这样做。如果我重载运算符 ==,类型是否不同我返回 false 否则我在元素之间进行真正的比较怎么办?【参考方案2】:

您可以检查对象的typeid

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

看到这个reference。

【讨论】:

-1 这不是正确答案,也没有解决所提出的问题。 @RemyLebeau:“我假设我无法将 Basic1 和 Basic2 等不同类型与 == 进行比较?”是问题的一部分,不是吗?我不认为我完全错误地说这些问题的一种可能解释就是:我可以为每种类型添加一个实例吗? 如果您想检查特定类类型的给定实例是否存在,通常会使用dynamic_cast 而不是typeid,特别是如果您还需要访问特定于类的成员时。

以上是关于检查向量中是不是存在元素[重复]的主要内容,如果未能解决你的问题,请参考以下文章

检查元素上是不是存在事件[重复]

检查元素是不是存在[重复]

检查html元素是不是存在的正确方法[重复]

检查是不是存在具有相同类的多个元素[重复]

jQuery检查元素是不是存在[重复]

Selenium Webdriver Python - 检查元素是不是可见/检测到/存在[重复]