当我们提供比较器函数时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说:
类型
Type1和Type2必须使得类型的对象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)
你甚至可以想象在哪里Type1和Type2不一样的情况,例如:
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
但是当我们尝试对它进行排序时,我仍然无法确切地知道如何在单个数组中有两种不同的类型.
数组中不能有两种不同的类型.比较者并不认为这是可能的.这样的指定只是因为:
因此规范提供了比"显而易见"更宽松的合同,以便在需要时帮助我们的代码更灵活.作为一个玩具示例,假设我们有这个比较器:
auto cmp(int a, long b) -> bool { return a < b; }
Run Code Online (Sandbox Code Playgroud)
为什么要阻止我们使用这个完全合法(尽管很愚蠢)的函数来排序整数数组?
但是当我们尝试对它进行排序时,我仍然无法确切地知道如何在单个数组中有两种不同的类型.
你不能.
但是Compare的要求不仅仅是排序数组,或者只是排序!
他们随时都想比较一件事和另一件事.
是minutes(42)不到hours(1)?是! 你可能会发现有用的比较器用于这种场合.
比较是一种更普遍的概念,可以在整个语言中使用.
是否可能有人为std :: sort的比较器函数提供了不同类型的小例子
其他人已经展示了一些例子,表明你必须找到一个"有用"的例子才能std::sort具体使用.
但它不是"std :: sort的比较器功能".它是一个比较器功能,你恰好正在使用它std::sort.
确实,在这样做时,您可能希望您选择的特定比较器接受相同类型的操作数.