【发布时间】:2011-07-28 04:19:53
【问题描述】:
我正在尝试编写用于 STL 算法的谓词函数。我看到它们是定义谓词的两种方式:
(1) 使用如下简单函数:
bool isEven(unsigned int i)
{ return (i%2 == 0); }
std::find_if(itBegin, itEnd, isEven);
(2) 使用operator()函数如下:
class checker {
public:
bool operator()(unsigned int i)
{ return (i%2 == 0); }
};
std::find_if(itBegin, itEnd, checker);
我对第二种类型有更多用途,因为我通常想创建一个包含一些成员的谓词对象并在算法中使用它们。当我在检查器中添加相同的 isEven 函数并将其用作谓词时,出现错误:
3.给出错误的语法:
class checker {
public:
bool isEven(unsigned int i)
{ return (i%2 == 0); }
};
checker c;
std::find_if(itBegin, itEnd, c.isEven);
在编译过程中调用 c.isEven 会出错,说明未定义对某些函数的引用。有人可以解释为什么 3. 给出错误吗?另外,如果有任何关于谓词和迭代器基础知识的指南,我将不胜感激。
【问题讨论】:
-
查看您的编译器是否足够现代以支持使用 lambda,例如:
std::find_if(itBegin, itEnd, [](int i){ return i%2 == 0;});。 -
@jerry - 谢谢..看起来是个很酷的主意。但我想我们正在牺牲对异国语法的代码重用:)。如果我有一个仿函数,我以后可以重复使用它,并且更容易维护
-
是的——如果你有一个很有可能在很多地方使用的函子,那么 lambda 可能不是最好的路线。同时,对于像这样的微不足道的代码,直接可见的收益可以超过重复带来的(可能的)损失。同时,我必须补充一点,最好不要将语法视为“异国情调”——包含它的新标准正在最终确定,并且大多数当前的编译器已经支持它;期待很快看到它被广泛使用。