如果元素存在于对向量中,则在 class 中查找
find inside a class if an element exists within a vector of pairs
我正在用 C++ 编写代码。我有一个包含很多文件的项目。我有一个名为列表的对向量,如下所示:
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;
}
在另一个方法中,但仍然在同一个方法中 class: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 >::迭代器, std::vector >::迭代器, classA::method1(int)::__lambda0)'
无需混合使用 bind
、bind1st
和 mem_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
,这避免了必须将结果与结束 interator
进行比较
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
returns 一个未指定类型的函数对象,但您将该对象当作成员函数 (mem_fun(&classA::Scheduled1)
) 使用,这显然是不正确的。在您的示例中,只需将上述 Scheduled1
对象作为第三个参数传递给 find_if
即可。
如@Praetorian 所述,您可以使用 lambda。但是,绑定器允许开箱即用地使用现有的谓词函数,并且有时更具可读性(新的 std::bind 自动将成员函数绑定到实例的事实允许人们使用 public 开箱即用类型的接口)。我添加了一个类似于您的示例(编译),我将在其中解释一些事情(参见代码注释):
#include <iostream>
#include <vector>
#include <utility>
#include <functional>
#include <algorithm>
// Replaces your structure...
struct Xs{};
// typedef so that we can alias the ugly thing...
typedef std::vector<std::pair<Xs, double>> XDoubleVector;
// --- From your code, I've just named it A for brevity....
struct A
{
bool Scheduled(std::pair<Xs,double> const el, double const t )
{
return el.second==t;
}
};
int main() {
using namespace std::placeholders;
//Instantiate it.... replaced your list.
XDoubleVector doubleVect;
//--- and add some elements....
//We need to instantiate A, in order to invoke
// a member function...
A a;
// Returns true if found...
return std::find_if(
doubleVect.begin(),
doubleVect.end(),
//Notes:
//- Scheduled is a member function of A
//- For that reason, we need to pass an instance of
// A to binder (almost seen as first bound).
//- _1 indicates that the first parameter to Scheduled will be
// passed in by algorithm
//- We've hardcoded the second parameter (it is therefore
// bound early).
std::bind(&A::Scheduled, a, _1, 20.9)) != doubleVect.end();
}
此致,维尔纳
我正在用 C++ 编写代码。我有一个包含很多文件的项目。我有一个名为列表的对向量,如下所示:
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;
}
在另一个方法中,但仍然在同一个方法中 class: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 >::迭代器, std::vector >::迭代器, classA::method1(int)::__lambda0)'
无需混合使用 bind
、bind1st
和 mem_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
,这避免了必须将结果与结束 interator
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
returns 一个未指定类型的函数对象,但您将该对象当作成员函数 (mem_fun(&classA::Scheduled1)
) 使用,这显然是不正确的。在您的示例中,只需将上述 Scheduled1
对象作为第三个参数传递给 find_if
即可。
如@Praetorian 所述,您可以使用 lambda。但是,绑定器允许开箱即用地使用现有的谓词函数,并且有时更具可读性(新的 std::bind 自动将成员函数绑定到实例的事实允许人们使用 public 开箱即用类型的接口)。我添加了一个类似于您的示例(编译),我将在其中解释一些事情(参见代码注释):
#include <iostream>
#include <vector>
#include <utility>
#include <functional>
#include <algorithm>
// Replaces your structure...
struct Xs{};
// typedef so that we can alias the ugly thing...
typedef std::vector<std::pair<Xs, double>> XDoubleVector;
// --- From your code, I've just named it A for brevity....
struct A
{
bool Scheduled(std::pair<Xs,double> const el, double const t )
{
return el.second==t;
}
};
int main() {
using namespace std::placeholders;
//Instantiate it.... replaced your list.
XDoubleVector doubleVect;
//--- and add some elements....
//We need to instantiate A, in order to invoke
// a member function...
A a;
// Returns true if found...
return std::find_if(
doubleVect.begin(),
doubleVect.end(),
//Notes:
//- Scheduled is a member function of A
//- For that reason, we need to pass an instance of
// A to binder (almost seen as first bound).
//- _1 indicates that the first parameter to Scheduled will be
// passed in by algorithm
//- We've hardcoded the second parameter (it is therefore
// bound early).
std::bind(&A::Scheduled, a, _1, 20.9)) != doubleVect.end();
}
此致,维尔纳