目前我正在研究标准模板库(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/