我在这里看过很多文章,但在比较的情况下,仍然没有找到仿函数类优于简单函数的优点。所以我有一个代码摘录,他们希望通过简单地遍历每个字符并将ASCII代码与从左到右的优先级进行比较来对unsigned char *
的向量进行排序。
仿函数是
class Sorter {
private:
unsigned int length;
public:
Sorter( unsigned int _length ): length( _length ) {}
bool operator()( const unsigned char* keyl, const unsigned char* keyr ) { return cmpKey( keyl, keyr, length ); }
};
并且cmpKey()
函数基本上完成了我上面描述的内容。对数据进行排序的调用是
sort( localList.begin(), localList.end(), Sorter( 100 ) );
其中100是每个字符串的长度。因此,我已经读过,仿函数具有从调用到调用存储阶段的优点,并允许该类用作普通函数。我有两个问题:
在这种情况下,这有什么好处?
将创建多少个Sorter
类的实例?它只是locaList
答案 0 :(得分:4)
length=100
。Sorter(100)
时,会创建一个仿函数。它可能被复制很少次(例如调用sort()
),但不能复制每个元素。答案 1 :(得分:2)
仿函数的主要用途是在运行时创建具有某种状态的函数。这在您需要函数来拥有某些信息的情况下很重要,但是您无法将此信息作为参数传递给函数。一个常见的例子是像std::sort
这样的算法,其中比较器函数必须只接受两个参数(要比较的东西),所以你不能只传递额外的信息作为参数。您必须在运行时创建一个函数对象,并在构造函数中传递该信息。
这基本上就是你打电话时所做的事情
sort( localList.begin(), localList.end(), Sorter( 100 ) );
您正在创建一个Sorter函数,其中在构造函数时传递有关100的信息。调用它仍然只需要两个参数,因此这将适用于std::sort
算法。除了std::bind
之外,没有其他方法可以使用常规函数。