我在用C ++编写代码。我有一个项目,文件太多。我有一个名为list的向量对,如下所示:

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


我想检查是否有特定的双精度值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可能应使用std::pairconst&参数,以避免不必要的复制。

另一种选择是使用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/

10-11 15:54