使用C ++仿函数的优势进行比较

时间:2017-06-26 06:29:50

标签: c++ function stdvector functor

我在这里看过很多文章,但在比较的情况下,仍然没有找到仿函数类优于简单函数的优点。所以我有一个代码摘录,他们希望通过简单地遍历每个字符并将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是每个字符串的长度。因此,我已经读过,仿函数具有从调用到调用存储阶段的优点,并允许该类用作普通函数。我有两个问题:

  1. 在这种情况下,这有什么好处?

  2. 将创建多少个Sorter类的实例?它只是locaList

  3. 的元素的1或多少

2 个答案:

答案 0 :(得分:4)

  1. 优点是你可以存储状态。在您的情况下,州是length=100
  2. 当您致电Sorter(100)时,会创建一个仿函数。它可能被复制很少次(例如调用sort()),但不能复制每个元素。

答案 1 :(得分:2)

仿函数的主要用途是在运行时创建具有某种状态的函数。这在您需要函数来拥有某些信息的情况下很重要,但是您无法将此信息作为参数传递给函数。一个常见的例子是像std::sort这样的算法,其中比较器函数必须只接受两个参数(要比较的东西),所以你不能只传递额外的信息作为参数。您必须在运行时创建一个函数对象,并在构造函数中传递该信息。

这基本上就是你打电话时所做的事情

 sort( localList.begin(), localList.end(), Sorter( 100 ) );

您正在创建一个Sorter函数,其中在构造函数时传递有关100的信息。调用它仍然只需要两个参数,因此这将适用于std::sort算法。除了std::bind之外,没有其他方法可以使用常规函数。