【问题标题】:C++ STL--make_heap with pair<int,string> as data typeC++ STL--make_heap 与 pair<int,string> 作为数据类型
【发布时间】:2012-10-22 19:39:40
【问题描述】:

我知道堆是如何工作的以及它如何排列最小和最大元素。如果 vector 只包含 int,那么在 STL 中应用 make_heap 很容易。但是如果向量包含字符串和整数的结构,如何应用make_heap()。我想根据结构中的int 值创建堆。 请告诉我该怎么做。

【问题讨论】:

  • 你试过什么?特别是,您是否尝试过给出明确的比较函数?
  • 不知道怎么比较好玩...
  • 我已经有一段时间没有看了,但是pair 没有提供您想要的订单吗?
  • @Hurkyl std::pair 的默认顺序是字典顺序。这意味着该对的两个元素都被考虑到排序,而不仅仅是第一个。对于 OP 即将构建的堆,它可能(也许)无关紧要,但对于稳定的排序,它会。
  • 您不需要自己的比较功能。请参阅我的答案和其中的链接。

标签: c++ heap


【解决方案1】:

是的,您可以直接将std::make_heapstd::pair&lt;int, std::string&gt; 一起使用,因为std::pair 具有所需的小于比较operator&lt;。在上面链接的参考中甚至还有一个使用 std::pair 的特定实例化的示例。

【讨论】:

    【解决方案2】:

    您必须为您的结构提供比较功能:

    struct A
    {
     int x, y;
    };
    
    struct Comp
    {
       bool operator()(const A& s1, const A& s2)
       {
           return s1.x < s2.x && s1.y == s2.y;
       }
    };
    
    std::vector<A> vec;
    std::make_heap(vec.begin(), vec.end(), Comp());
    

    【讨论】:

    • 为什么比较器中的第二个条件(s1.y == s2.y)?
    • 这只是一个不关心比较逻辑的例子
    • 我认为没有比较功能的必要,除非你想指定自己的逻辑。如果你想要字典比较,只需使用默认值。
    猜你喜欢
    • 2011-02-18
    • 1970-01-01
    • 1970-01-01
    • 2021-12-31
    • 2015-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多