std的目的:在调用<运算符时少(或类似函数)

cod*_*707 3 c++ c++11

std::less当它只调用<运算符时,为什么需要(和等效的其他函数对象),我们可以反过来运算符?

可能的答案有问题:

为什么std ::比"<"更好?

但是我并不完全相信(特别是关于弱排序).有人可以解释一下吗?

Nat*_*ica 7

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 次

最近记录:

7 年,5 月 前