C++ std::在对象指针向量上查找

C++ std::在对象指针向量上查找,c++,class,vector,member,C++,Class,Vector,Member,我有一个类a,其成员是另一个类B class A { std::vector<B*> m_member_A A类 { std::向量m_成员A 现在我想在m_member_a上执行std::find。 例如。 if(std::find(m_member_A.begin()、m_member_A.end()、B_obj*)!=m_member_A.end()) 查找在这样的向量上没有意义。我如何实现这样的功能 如果它是B的对象的向量(不是指针),它会发生什么变化?向量与st

我有一个类
a
,其成员是另一个类
B

class A
{
    std::vector<B*> m_member_A
A类
{
std::向量m_成员A
现在我想在
m_member_a
上执行
std::find
。 例如。
if(std::find(m_member_A.begin()、m_member_A.end()、B_obj*)!=m_member_A.end())

查找在这样的向量上没有意义。我如何实现这样的功能


如果它是B的对象的向量(不是指针),它会发生什么变化?

向量与
std::find一起工作非常好

auto result = std::find(m_member_A.begin(), m_member_A.end(), itemToFind);
if (result != m_member_A.end()) {
  // found it!
}
或者,如果需要取消对指针的引用:

auto result = std::find_if(m_member_A.begin(), m_member_A.end(), 
  [] (B* item) { 
    if (item == nullptr) return false; // may want to do something else here
    return *item == someValue;
  });
if (result != m_member_A.end()) {
  // found it!
}

演示:

矢量与
std::find配合使用效果非常好

auto result = std::find(m_member_A.begin(), m_member_A.end(), itemToFind);
if (result != m_member_A.end()) {
  // found it!
}
或者,如果需要取消对指针的引用:

auto result = std::find_if(m_member_A.begin(), m_member_A.end(), 
  [] (B* item) { 
    if (item == nullptr) return false; // may want to do something else here
    return *item == someValue;
  });
if (result != m_member_A.end()) {
  // found it!
}

演示:

如果您想比较值而不是比较指针,您可能需要使用std::find\u,如果:

bool IsFoo (B* _item) {
    bool result = false;

    if ( _item != nullptr && _item->value == 1 ) //Whatever is your criteria
        result = true; 

    return result;
}

std::vector<B*> m_member_A;
B* instance = std::find_if (m_member_A.begin(), m_member_A.end(), IsFoo);
bool-IsFoo(B*\u项){
布尔结果=假;
如果(_item!=nullptr&&&u item->value==1)//无论您的标准是什么
结果=真;
返回结果;
}
std::向量m_成员A;
B*instance=std::find_if(m_member_A.begin()、m_member_A.end()、IsFoo);

如果要比较值而不是比较指针,可能需要使用std::find\u,如果:

bool IsFoo (B* _item) {
    bool result = false;

    if ( _item != nullptr && _item->value == 1 ) //Whatever is your criteria
        result = true; 

    return result;
}

std::vector<B*> m_member_A;
B* instance = std::find_if (m_member_A.begin(), m_member_A.end(), IsFoo);
bool-IsFoo(B*\u项){
布尔结果=假;
如果(_item!=nullptr&&&u item->value==1)//无论您的标准是什么
结果=真;
返回结果;
}
std::向量m_成员A;
B*instance=std::find_if(m_member_A.begin()、m_member_A.end()、IsFoo);

如果您想通过指针找到一个值指针,而不是给定的指针,您可以将
std::find\u If
与合适的函子一起使用:

struct Foo
{
  int i;
};

bool operator==(const Foo& lhs, const Foo& rhs) { return lhs.i == rhs.i; }

std::vector<Foo*> v = ....;

Foo f{42};

std::find_if(v.begin(), v.end(), [&f](const Foo* p) { return *p == f; });
structfoo
{
int i;
};
bool操作符==(constfoo&lhs,constfoo&rhs){返回lhs.i==rhs.i;}
标准:向量v=。。。。;
富福{42};
std::find_if(v.begin(),v.end(),[&f](const-Foo*p){return*p==f;});

如果您想通过指针找到一个值指针,而不是给定的指针,您可以将
std::find\u If
与合适的函子一起使用:

struct Foo
{
  int i;
};

bool operator==(const Foo& lhs, const Foo& rhs) { return lhs.i == rhs.i; }

std::vector<Foo*> v = ....;

Foo f{42};

std::find_if(v.begin(), v.end(), [&f](const Foo* p) { return *p == f; });
structfoo
{
int i;
};
bool操作符==(constfoo&lhs,constfoo&rhs){返回lhs.i==rhs.i;}
标准:向量v=。。。。;
富福{42};
std::find_if(v.begin(),v.end(),[&f](const-Foo*p){return*p==f;});


什么意思?没有意义?@LuchianGrigore我想他想通过值而不是指针来比较我的意思是找到指针意味着什么。@在指针上,这意味着你找到了一个对象,该对象与传递给
find
的值位于同一内存地址。我想你在寻找
find\u if
,它接受一个谓词。在谓词中,您可以取消对指针的引用并调用成员函数等。什么是没有意义的?@LuchianGrigore我猜他想通过值而不是指针进行比较。我的意思是找到指针意味着什么。@OnTheRock意味着您找到了一个位于同一内存a中的对象ddress作为传递给
find
的值。我认为您正在查找
find\u if
,它接受谓词。在谓词中,您可以取消引用指针并调用成员函数等@Jarod42不需要。由用户传递包含有效指针的向量。因此首先我需要重载比较运算符,因为find使用比较运算符进行比较。我说得对吗?@ontherocks这只是一个例子。你可以在functor本身中实现所有比较逻辑。明白了。谢谢。另一方面,如果我重载比较运算符,std::find将完全像内置数据类型一样工作……对吗?@ontherocks如果你有
std::vector
,但是如果你的向量包含指针,它将不起作用。而且你不允许为指针重载比较运算符。@Jarod42不,我不允许。由用户传递包含有效指针的向量。因此,首先我需要重载比较运算符,因为find使用比较运算符进行比较。我说得对吗?@ontherocks这只是一个例子。你可以实现函子本身的所有比较逻辑。明白了。谢谢。另一方面,如果我重载比较运算符,std::find将与内置数据类型完全一样工作……对吗?@OnTheRock如果你有一个
std::vector
,它将工作,但如果你的向量包含指针。并且不允许为指针重载比较运算符。如果我遵从指针,我将保留对象。“查找”对象意味着什么?(因为我没有重载比较运算符)@在指针上,您需要自己在lambda中实现该条件,并在满足该条件时返回true。如果我遵从指针,我将保留该对象。“查找”对象意味着什么?(因为我没有重载比较运算符)@在eRoom上,您需要自己在lambda中实现这些条件,并在满足条件时返回true。@Jarod42 true..它是作为快速示例而不是作为复制粘贴类解决方案,我无论如何都会更新它。@Jarod42 true..它是作为快速示例而不是作为复制粘贴类解决方案,我无论如何都会更新它。