C++中`std :: sort`比较器的不同类型

Afs*_*hin 21 c++

当我们提供比较器函数时std::sort,我们使用以下重载:

template< class RandomIt, class Compare >
void sort( RandomIt first, RandomIt last, Compare comp );
Run Code Online (Sandbox Code Playgroud)

其中比较器函数std::sort应具有以下语法:

bool cmp(const Type1 &a, const Type2 &b);
Run Code Online (Sandbox Code Playgroud)

但正如你所看到的a,b可能有不同的类型.cppreference说:

类型Type1Type2必须使得类型的对象RandomIt 可以被解除引用,然后隐式转换为它们两者.

但是当我们尝试对它进行排序时,我仍然无法准确理解我们如何在单个数组中有两种不同的类型.

是否有人可以为std::sort比较器功能提供不同类型的小例子?

Fan*_*Fox 20

它不是存储在数组中的内容,只能存储一种类型.它是关于比较器功能的.以此为例:

struct Animal {};
struct Cat : Animal {};
struct Dog : Animal {};
struct Hound : Dog {};

bool cmp(const Animal &a, const Animal &b);
Run Code Online (Sandbox Code Playgroud)

即使你有一个Dogs,Cats或Hounds 列表,你仍然可以使用该函数对它们进行排序,cmp因为它们都可以隐式转换.即.

std::vector<Hound> hounds;
... // fill hounds
std::sort(hounds.begin(), hounds.end(), cmp);
Run Code Online (Sandbox Code Playgroud)

你甚至可以想象在哪里Type1Type2不一样的情况,例如:

bool cmp(const Animal &a, const Dog &b);
etc ...
Run Code Online (Sandbox Code Playgroud)

虽然这种情况非常罕见.

类型Type1 (Animal)和Type2 (Dog)必须使得RandomIt (Hound)类型的对象可以被解除引用,然后隐式转换为它们.这是真的.

关键是对cmp函数可以采用的类型的限制,排除了一般性.在某些情况下,这是一个好主意,但在这种情况下,这将是不合理的严格,并可能会迫使边缘案例实施的问题.此外,使用的cmp函数std::sort比较(为简单起见)规定的要求的约束.比较要求用于各种其他事情,例如std::max.


Sto*_*ica 13

但是当我们尝试对它进行排序时,我仍然无法确切地知道如何在单个数组中有两种不同的类型.

数组中不能有两种不同的类型.比较者并不认为这是可能的.这样的指定只是因为:

  1. 当类型不同时,代码可以很好地形成.
  2. 要求相同类型的限制几乎没有任何目的.

因此规范提供了比"显而易见"更宽松的合同,以便在需要时帮助我们的代码更灵活.作为一个玩具示例,假设我们有这个比较器:

auto cmp(int a, long b) -> bool { return a < b; }
Run Code Online (Sandbox Code Playgroud)

为什么要阻止我们使用这个完全合法(尽管很愚蠢)的函数来排序整数数组?


Lig*_*ica 7

但是当我们尝试对它进行排序时,我仍然无法确切地知道如何在单个数组中有两种不同的类型.

你不能.

但是Compare的要求不仅仅是排序数组,或者只是排序!

他们随时都想比较一件事和另一件事.

minutes(42)不到hours(1)?是! 你可能会发现有用的比较器用于这种场合.

比较是一种更普遍的概念,可以在整个语言中使用.

是否可能有人为std :: sort的比较器函数提供了不同类型的小例子

其他人已经展示了一些例子,表明你必须找到一个"有用"的例子才能std::sort具体使用.

但它不是"std :: sort的比较器功能".它是一个比较器功能,你恰好正在使用它std::sort.

确实,在这样做时,您可能希望您选择的特定比较器接受相同类型的操作数.