std::less当它只调用<运算符时,为什么需要(和等效的其他函数对象),我们可以反过来运算符?
可能的答案有问题:
但是我并不完全相信(特别是关于弱排序).有人可以解释一下吗?
std::less和朋友的目的是它允许你概括你的代码.让我们说我们正在编写一个排序函数.我们一开始
void sort(int * begin, int * end) { /* sort here using < /* }
Run Code Online (Sandbox Code Playgroud)
所以现在我们可以对我们可以获得的容器进行排序int*.现在让我们把它变成一个模板,这样它就适用于所有类型
template<typename Iterator>
void sort(Iterator begin, Iterator end) { /* sort here using < /* }
Run Code Online (Sandbox Code Playgroud)
现在我们可以对任何类型进行排序,并且我们使用"迭代器"作为我们说我们需要指向元素的东西的方式.这一切都很好,但这意味着我们需要传递任何类型来提供operator <它的工作.它也不允许使用更改排序顺序.
现在我们可以使用函数指针,但这对内置类型不起作用,因为没有可以指向的函数.如果我们改为创建一个额外的模板参数,让我们调用它Cmp,那么我们可以在类型的函数中添加另一个参数Cmp.这将是比较功能.我们想为此提供一个默认值,因此使用std::less非常简单,并为我们提供良好的"默认"行为.
有这样的东西
template<typename Iterator, typename Cmp>
void sort(Iterator begin, Iterator end,
Cmp c = std::less<typename std::iterator_traits<Iterator>::value_type>)
{ /* sort here using c /* }
Run Code Online (Sandbox Code Playgroud)
它允许您对所有内置类型,任何具有a的类型进行排序operator <,并允许您指定任何其他方式来比较数据中的元素以对其进行排序.
这就是我们需要std::less和朋友的原因.它让我们使代码通用且灵活,而无需编写大量的锅炉板.
使用函数对象也为我们带来了一些性能优势.如果使用函数指针,编译器更容易内联对函数调用操作符的调用.它还允许比较器具有状态,就像它被调用的次数一样.有关此内容的更深入了解,请参阅C++ Functors及其用法.
| 归档时间: |
|
| 查看次数: |
201 次 |
| 最近记录: |