我在这里看到了许多文章,但是在比较的情况下,仍然没有弄清楚函子类比简单函数的优势。因此,我有一个代码摘录,在其中,他们希望通过简单地遍历每个字符并将ASCII码的优先级从左到右进行比较来对unsigned char *的 vector 进行排序。

函子是

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的元素还是1个元素?
  • 最佳答案

    函数的主要用途是在运行时创建具有某些状态的函数。这在需要一个函数来拥有某些信息但不能将这些信息作为参数传递给函数的情况下非常重要。一个常见的例子是像std::sort这样的算法,其中比较器函数必须仅接受两个参数(要比较的事物),因此您不能仅仅传递额外的信息作为参数。相反,您必须在运行时创建一个函数对象,然后在构造函数中传递该信息。

    这实际上是您打电话时所做的

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

    您正在创建一个Sorter函数,其中在构造该函数时传递有关100的信息。调用它仍然只需要两个参数,因此可以在std::sort算法中使用。除了std::bind之类的东西,没有其他方法可以通过常规函数来完成。

    10-08 08:48
    查看更多