gpt4 book ai didi

predicate - 理解 find_if 谓词

转载 作者:行者123 更新时间:2023-11-28 07:26:22 25 4
gpt4 key购买 nike

我正在研究从另一个 SO 帖子中获得的以下示例。示例是这样的

class checker 
{
public:
bool operator()(unsigned int i)
{
if (i%2 == 0)
{
return true; --------------->Statement A
}
return false;

}
};

std::vector<int> vec;
vec.push_back(3);
vec.push_back(5);
vec.push_back(2);
if(std::find_if(vec.begin(), vec.end(), checker()) != vec.end())
{
std::cout << "Found";
}

现在我对上面的例子有三个问题:

Q1- find_if 的第三个参数接受谓词。这里我使用了一个仿函数对象。该谓词应该是一个指针(地址)还是一个对象。在这里我传递了一个对象,但是在这个例子中是 msdn它传递一个地址。我在那个例子中意识到谓词不是类的成员方法。但是,如果有人可以在这里阐明谓词参数的要求,我将不胜感激。因为如果它可以接受函数指针那么这是行不通的

bool (checker::*aptr)(unsigned int) = NULL;  //Function ptr of class method
aptr = &(checker::operator());
if(std::find_if(vec.begin(), vec.end(), aptr) != vec.end()){...};

Q2- 虽然上面的例子工作正常,但是当我在语句 A 处放置一个断点时,断点永远不会被击中,它应该是因为它返回了一个真值。澄清这一点会有所帮助。

Q3- 一些示例从 std::unary_function<key_struct, bool> 派生了结构/class这是什么原因。上面的类(class)对我来说效果很好。为什么需要从 std::unary_function<key_struct, bool> 派生它? ?

最佳答案

  1. 谓词参数可以是任何可以像具有相应参数的函数一样调用并返回可转换为 bool 的东西。它可以是函数对象,即具有函数调用运算符或函数指针的类的对象。如果您不修改您的对象,您可能应该使函数调用运算符 const
  2. 猜测函数运算符最终被内联,并且您将断点放入函数对象的外联版本中。使用内联函数设置断点可能很棘手。出于测试目的,您可能想尝试使函数成为非内联函数。出于生产目的,您希望使大多数谓词内联,因为这会带来巨大的性能差异。
  3. 将函数对象适配器(例如,std::not1())与函数对象一起使用时,它们需要定义某些嵌套类型。对于普通函数,可以很容易地推导出相应的关联类型,例如返回类型和参数类型。对于函数对象,它们不能在 C++03 中推导出来。在 C++11 中,所有嵌套类型都不是必需的(如果我没记错的话)。在任何情况下,std::find_if() 除了调用函数对象之外不需要弄乱函数对象,即实际上不需要任何嵌套类型。

顺便说一句,你的谓词有什么理由不只返回表达式的结果吗?也就是说,我会这样实现它:

struct checker {
bool operator()(unsigned int i) const { return (i % 2) == 0; }
};

关于predicate - 理解 find_if 谓词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18689952/

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