我在用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)”
最佳答案
无需混合使用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
可能应使用std::pair
的const&
参数,以避免不必要的复制。另一种选择是使用
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/