代码之家  ›  专栏  ›  技术社区  ›  Afshin

C++中的“STD::排序”比较器的不同类型

c++
  •  21
  • Afshin  · 技术社区  · 6 年前

    std::sort ,我们使用以下重载:

    template< class RandomIt, class Compare >
    void sort( RandomIt first, RandomIt last, Compare comp );
    

    标准::排序

    bool cmp(const Type1 &a, const Type2 &b);
    

    但正如你所见 a b 可能有不同的类型。 cppreference 说:

    类型 Type1 Type2 必须使 RandomIt 可以取消引用,然后隐式转换为两者。

    标准::排序 的比较器功能?

    6 回复  |  直到 6 年前
        1
  •  20
  •   Fantastic Mr Fox    6 年前

    这与数组中存储的内容无关,只能存储一种类型。它是关于比较器函数是什么的。例如:

    struct Animal {};
    struct Cat : Animal {};
    struct Dog : Animal {};
    struct Hound : Dog {};
    
    bool cmp(const Animal &a, const Animal &b);
    

    即使你有一张 Dog 是的, Cat Hound 您仍然可以使用函数对它们进行排序 cmp

    std::vector<Hound> hounds;
    ... // fill hounds
    std::sort(hounds.begin(), hounds.end(), cmp);
    

    你甚至可以想象 Type1 Type2 是不一样的,例如:

    bool cmp(const Animal &a, const Dog &b);
    etc ...
    

    尽管这是非常罕见的。

    类型1 (动物) 和类型2 (狗) (猎犬) 可以取消引用,然后隐式转换为两者。 .

    化学机械抛光 功能可以采取相同的,排除一般性。在某些情况下,这是一个好主意,但在这种情况下,这将是不合理的严格,可能会迫使边缘案例实现出现问题。此外 中使用的函数 std::sort Compare (可能是为了简单起见)。 比较需求 用于各种其他用途,比如 std::max

        2
  •  13
  •   StoryTeller - Unslander Monica    6 年前

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

    一个数组中不能有两种不同的类型。比较仪显示这是不可能的。之所以这样说是因为:

    1. 可以 当类型不相同时,格式良好。
    2. 要求相同的类型是一个限制,几乎没有任何作用。

    auto cmp(int a, long b) -> bool { return a < b; }
    

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

        3
  •  7
  •   Lightness Races in Orbit    6 年前

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

    但是 比较

    minutes(42) 小于 hours(1) ? 对!你可能会发现在这种情况下比较有用。

    是一个更普遍的概念,在整个语言中都有使用。

    有没有可能有人为std::sort的comparator函数提供了一个不同类型的小示例

    其他人已经展示了一些例子,说明你必须找到一个“有用”的例子来对付你,这是多么愚蠢 std::sort 明确地。

    但它不是“std::sort的比较函数”。它是 比较器函数,你正好和它一起使用 标准::排序 .

        4
  •  4
  •   eerorika    6 年前

    但我仍然不能确切地知道我们如何在一个数组中有两种不同的类型

    一个数组中不能有两种不同的类型。

    数组只能有单一类型的对象。但是单一类型必须隐式转换为两种参数类型 cmp .

    干得好:

    int arr[] = {1, 2, 3, 0};
    auto cmp = [](const int &a, const long &b) {
        return a < b;
    };
    std::sort(std::begin(arr), std::end(arr), cmp);
    

    化学机械抛光

        5
  •  4
  •   Deduplicator    6 年前

    a的要求 比较器 比你想象的要宽松得多:

    1. 它必须接受序列中两个未引用的迭代器作为参数。
    2. 返回值必须在上下文中可转换为 bool .
    3. 它必须是可复制且不可破坏的完整类型。
    4. 它不能修改参数,因此不会干扰调用算法。
      如果引用被使用,这并不意味着使用常量引用。
    5. 它必须诱导出一个完全弱序(cmp(a,b)!cmp(b,a),cmp(a,b)和&cmp(b,c)表示cmp(a,c))。

    因此,一个有效但相当无用的比较方法是:

    template <class... X>
    auto useless(X&&...) { return nullptr; }
    
        6
  •  1
  •   Caleth    6 年前

    Compare 不是说你排序的序列中的元素太多,而是允许所有元素 comp 为什么

    if (comp(*first, *other))
    

    是有效的。

    大多数时候 Type1 将等于 Type2 ,但事实并非如此 必修的