目前我正在学习标准模板库(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;
}
}
Run Code Online (Sandbox Code Playgroud)
但我不明白为什么我们的教授有重载()操作符?
谢谢.
UnitLess是一个二元谓词,需要在STL中具有两个参数可调用.
通过在UnitLess该类型的实例中重载函数调用操作符可以像使用两个longs并返回a 的函数一样使用bool.
UnitLess f;
f(5, 10);
Run Code Online (Sandbox Code Playgroud)
相当于
bool f(long first, long second)
{
long fu = first % 10;
long su = second % 10;
return fu < su;
}
f(5, 10);
Run Code Online (Sandbox Code Playgroud)
该类的目的是实现一个以给定方式对集合中的元素进行排序的函数.这被称为谓词.
它被实现为一个仿函数,即允许函数操作符在一个对象上使用(这就是std :: set在引擎盖下做的事情).这样做是STL和类似代码调用自定义对象的常用方法.(函数指针比函数对象(aka functor)更受限制
所以它的使用方式如下:
Unitless functor;
functor(123, 124); // returns true or false
Run Code Online (Sandbox Code Playgroud)
std :: set是一个已排序的二叉树,因此它会在每个插入上多次调用Unitless的()-operator来确定每个long值的位置.
尝试编译并在其中放置一些printf/std :: cout,看看会发生什么.
另外,请注意这样的回调(即当您看不到对代码的调用时)在学习曲线的开头是可怕且令人困惑的.
;)