c++ - 为什么这个程序要重载 () 运算符?

标签 c++ stl set

目前我正在研究标准模板库(STL)。

在这个程序中,我将一些长值存储在 Associative Container 中,然后根据单位的位置(根据单位位置的数字)对它们进行排序。

代码:

#include <iostream>
#include <set>
#include <functional>

using namespace std;

class UnitLess
{
public:
    bool operator()(long first, long second)
    {
        long fu = first % 10;
        long su = second % 10;

        return fu < su;
    }
};

typedef set<long, UnitLess> Ctnr;

int main(void)
{
    Ctnr store;

    store.insert(3124);
    store.insert(5236);
    store.insert(2347);
    store.insert(6415);
    store.insert(4548);
    store.insert(6415);

    for(Ctnr::iterator i = store.begin(); i != store.end(); ++i)
    {
        cout << *i << endl;
    }
}

但我不明白为什么我们的教授要重载 () 运算符?

谢谢。

最佳答案

该类的目的是实现一个以给定方式对集合中的元素进行排序的函数。这称为谓词。

它是作为仿函数实现的,即通过允许函数运算符在对象上使用(这就是 std::set 在幕后所做的)。这样做是 STL 和类似代码调用自定义对象的常用方式。 (函数指针比函数对象(又名仿函数)更受限制

所以是这样使用的:

Unitless functor;

functor(123, 124); // returns true or false

std::set 是一个排序的二叉树,所以它在每次插入时多次调用 Unitless 的 ()-运算符以确定每个 long 值应该去哪里。

尝试编译并将一些 printf/std::cout 放入其中,看看会发生什么。

另外,请注意,在学习曲线的开始阶段,像这样的回调(即当您看不到对代码的调用时)是令人恐惧和困惑的。

  • 然后你就会习惯它并在所有地方使用它们,因为它们很整洁。
  • 然后您的代码再次变得可怕和困惑,您像躲避瘟疫一样避开它们。
  • 然后你就变成了一个胶带程序员,只在合适的地方使用它们,而绝不会在其他地方使用。

;)

关于c++ - 为什么这个程序要重载 () 运算符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3888867/

相关文章:

C++在虚方法中访问公共(public)变量

c++ - 3维多边形的洪水填充

C++:添加到输出中的不需要的数字

c++ - 成为瓶颈时优化 `std::vector operator []`( vector 访问)

c++ - 使用迭代器调用STL Set中的非静态函数

c++ - c++中代码的缩写

c++ - 分配器 : how are the standard containers expected to work internally?

c++ - 哪个 STL 容器用于相互关联的数据?

java - 测试一个字符串是否与集合中的任何其他字符串不同

python - 初始化集合理解