检查向量中是不是存在元素[重复]
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
,指定“平等”标准(您没有在问题中列出。)
并且不要使用向量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
,特别是如果您还需要访问特定于类的成员时。 以上是关于检查向量中是不是存在元素[重复]的主要内容,如果未能解决你的问题,请参考以下文章