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..它是作为快速示例而不是作为复制粘贴类解决方案,我无论如何都会更新它。