gpt4 book ai didi

c++ - 如果元素存在于对 vector 中,则在类中查找

转载 作者:行者123 更新时间:2023-11-27 22:58:12 27 4
gpt4 key购买 nike

我正在用 C++ 编写代码。我有一个包含很多文件的项目。我有一个名为列表的对 vector ,如下所示:

std::vector< std::pair< structure1, double> > list;

并且我想检查对于特定的 double 值 z 是否存在一个元素: el 在列表中这样: el.second == z

我想使用find_if

为此,我实现了一个方法:Scheduled,它接受两个参数:第一个是类似于存储在列表中的元素,第二个是要查找的特定值.我尝试了几种方法,但最终总是出错第一种方式:

 bool classA::Scheduled(std::pair< structure1,double > const el, double const t )
{
return el.second==t;

}

在另一个方法中但仍在同一个类中:classA

auto Scheduled1 = std::bind(&classA::Scheduled,this,_1,z);



bool call=std::find_if(list.begin(),list.end(),Scheduled1)=!list.end();

此解决方案给出以下错误:

 error: ‘Scheduled1’ does not name a type

第二种方式:直接使用 lambda

bool call = std::find_if(list.begin(),list.end(),[this](std::pair<struct1,double> const& el){return el.second==z;})!=list.end();

z是classA的成员变量第二种编码方式会导致此错误:

error: no matching function for call to 

‘find_if(std::vector >::iterator, std::vector >::iterator, classA::method1(int)::__lambda0)’

最佳答案

无需混合使用 bindbind1stmem_fun 来执行此操作(后两者在 C++11 中已弃用);只需使用 lambda

bool call = std::find_if(list.begin(), list.end(),
[this](std::pair< strucure1,double > const& el) {
return el.second == z;
}) != list.end();

或者如果你想调用 Scheduled

bool call = std::find_if(list.begin(), list.end(),
[this](std::pair< strucure1,double > const& el) {
return Scheduled(el, z);
}) != list.end();

如果必须使用bind

bool call = std::find_if(list.begin(), list.end(),
std::bind(&classA::Scheduled, this, _1, z)) != list.end();

在任何一种情况下,您可能希望将 Scheduled 更改为 static 成员函数,因为它不需要访问任何非静态成员,在这种情况下bind 选项变为

bool call = std::find_if(list.begin(), list.end(),
std::bind(&classA::Scheduled, _1, z)) != list.end();

此外,Scheduled 可能应该采用 const&std::pair 参数以避免不必要的复制。

另一种选择是使用 any_of而不是 find_if,这避免了必须将结果与最终插入器进行比较

bool call = std::any_of(list.begin(), list.end(),
<insert lambda or bind expression>);

这是对您的尝试有什么问题的解释。

auto Scheduled1=std::bind(Scheduled, _1, z);

Scheduled 是一个非静态成员函数,这意味着它有一个隐式的第一个参数,一个指向它必须被调用的实例的指针,即 this 指针.此外,创建指向成员函数的指针的语法是 &ClassName::MemberFunctionName。所以上面一行应该是

auto Scheduled1=std::bind(&classA::Scheduled, this, _1, z);

bind返回未指定类型的函数对象,但您将该对象当作成员函数 (mem_fun(&classA::Scheduled1)) 使用,这显然是不正确的。只需将上面的 Scheduled1 对象作为第三个参数传递给示例中的 find_if 就可以了。

关于c++ - 如果元素存在于对 vector 中,则在类中查找,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30483667/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com