C++仿函数的优势比较
Advantage of C++ functor use for comparison
我在这里看了很多文章,但仍然没有弄清楚仿函数 class 在比较情况下相对于简单函数的优势。所以我有一段代码摘录,其中他们想通过简单地遍历每个字符并从左到右比较 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 是每个字符串的长度。所以,我读到仿函数具有存储调用阶段的优势,并允许 class 用作普通函数。我有两个问题:
在这种情况下这样做有什么好处?
将创建多少个 Sorter
class 实例?是只有1个还是和locaList
的元素一样多?
- 优点是可以存储状态。在你的情况下,状态是
length=100
.
- 调用
Sorter(100)
时会创建一个仿函数。它可能会被复制少量次(例如调用 sort()
),但不是每个元素都被复制。
仿函数的主要用途是在运行时创建具有某种状态的函数。这在需要函数拥有某些信息但不能将此信息作为参数传递给函数的情况下很重要。一个常见的例子是在像 std::sort
这样的算法中,比较函数 必须 只接受两个参数(要比较的东西),所以你不能只传递额外的信息作为参数。您必须改为在运行时创建一个函数对象,并在构造函数中传递该信息。
这基本上就是您调用时所做的
sort( localList.begin(), localList.end(), Sorter( 100 ) );
您正在创建一个 Sorter 函数,您在构造该函数时传递有关 100 的信息。调用它仍然只需要两个参数,因此这将适用于 std::sort
算法。除了 std::bind
.
之类的东西之外,没有办法用常规函数来做到这一点
我在这里看了很多文章,但仍然没有弄清楚仿函数 class 在比较情况下相对于简单函数的优势。所以我有一段代码摘录,其中他们想通过简单地遍历每个字符并从左到右比较 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 是每个字符串的长度。所以,我读到仿函数具有存储调用阶段的优势,并允许 class 用作普通函数。我有两个问题:
在这种情况下这样做有什么好处?
将创建多少个
Sorter
class 实例?是只有1个还是和locaList
的元素一样多?
- 优点是可以存储状态。在你的情况下,状态是
length=100
. - 调用
Sorter(100)
时会创建一个仿函数。它可能会被复制少量次(例如调用sort()
),但不是每个元素都被复制。
仿函数的主要用途是在运行时创建具有某种状态的函数。这在需要函数拥有某些信息但不能将此信息作为参数传递给函数的情况下很重要。一个常见的例子是在像 std::sort
这样的算法中,比较函数 必须 只接受两个参数(要比较的东西),所以你不能只传递额外的信息作为参数。您必须改为在运行时创建一个函数对象,并在构造函数中传递该信息。
这基本上就是您调用时所做的
sort( localList.begin(), localList.end(), Sorter( 100 ) );
您正在创建一个 Sorter 函数,您在构造该函数时传递有关 100 的信息。调用它仍然只需要两个参数,因此这将适用于 std::sort
算法。除了 std::bind
.