【问题标题】:Sorting a vector of pairs [duplicate]对成对的向量进行排序[重复]
【发布时间】:2013-08-09 09:12:30
【问题描述】:

我有一个关于排序向量对的问题:

std::vector<std::pair<double,Processor*>> baryProc;

这个向量已经被这些对填满了。 现在我想根据对内的双精度值对向量内的对进行排序

示例:

假设我在向量中有 3 对。 pair1 在前面,pair 3 在末尾。 pair2 在中间:

pair1(1, proc1) 
pair2(3, proc2)
pair3(2.5, proc3)

现在我想根据双精度值对配对进行排序。所以向量内的顺序是:

pair1(1, proc1) 
pair3(2.5, proc3)
pair2(3, proc2)

我怎么能这样做?我被困住了。

【问题讨论】:

    标签: c++ sorting vector std-pair


    【解决方案1】:
    #include <algorithm>
    
    int main(){
    
        std::vector<std::pair<double,Processor*>> baryProc;
    
        std::sort(baryProc.begin(),baryProc.end());
    }
    

    请注意,您不需要自定义比较器,因为 pair 的默认比较器可以满足您的需求。它首先比较第一个元素,如果它们相同,则比较该对中的第二个元素。

    【讨论】:

    • 如果double 值被保证是唯一的(实际上是一个“集合”),这个工作。但是如果没有这样的保证(如果需要,可以强制),您需要编写一个比较器。 pair 的默认比较器通常执行 return (a.first &lt; b.first || (a.first == b.first &amp;&amp; a.second &lt; b.second; 后者是指针比较器,它会用 first 的非唯一值咬你。
    • 当第一个元素相同时,我们没有条件帮助我们做什么。那么如果我们使用默认比较器会发生什么?
    • 为什么指定std::vectorstd::pair 而不是std::sort?如果你这样做了,你可以完全摆脱 using namespace std 位。
    • @hoosssein 查看我的评论。默认的小于运算符(由std::less&lt;&gt;std::pair&lt;&gt; 调用可以并且将在需要时点击both 值(通常如我所述)。解决方案是提供 custom比较器,正如 maditya 所证明的那样。
    • 所以,据我了解,这是我的原因导致排序不一致?或者您只是担心导致最多 5 个 CPU 时钟的 2 个指针之间的简单比较?
    【解决方案2】:

    在 C++ 中,您可以使用自定义比较器函数来指定在排序时如何决定一个元素是否在另一个元素之前。在您的情况下,给定 2 对,您希望第一个元素的值较低的一对排在另一个之前。您可以像这样编写比较器函数:

    // This function returns true if the first pair is "less"
    // than the second one according to some metric
    // In this case, we say the first pair is "less" if the first element of the first pair
    // is less than the first element of the second pair
    bool pairCompare(const std::pair<double, Processor*>& firstElem, const std::pair<double, Processor*>& secondElem) {
      return firstElem.first < secondElem.first;
    
    }
    

    现在,将此函数传递给您的排序方法:

    //The sort function will use your custom comparator function 
    std::sort(baryProc.begin(), baryProc.end(), pairCompare);
    

    【讨论】:

    • +1 是从 std::pair 的正常 less-operator 中消除 .second 比较的一个很好的例子。我更愿意为此使用仿函数(更有可能内联),但功能解决方案仍然有效。
    • 感谢您的精彩解释。我想标准比较器会很好用。如果双精度值通常相同,标准运算符会正确排序吗?例如:(1,proc1), (1,proc2), (2,proc3), (3,proc4), (3,proc5),....
    • @user2633791 您要问的是排序是否为stable。如果具有相同值的两个元素在排序结束时保持与开始时相同的顺序,则排序算法是稳定的。默认排序算法不稳定,但 STL 提供了一个stable sort 应该适合您的目的。
    • 谢谢。如果你使用我自己的比较器我的编译器说:这个函数调用错过了这个指针会毁了我的参数列表:)
    • @maditya 知道为什么我的编译器会这样说吗?此函数调用缺少参数。使用“&pairCompare”而不是“pairCompare”来获取该成员的指针。但这样做无济于事
    猜你喜欢
    • 2013-10-15
    • 2011-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-08
    • 2020-12-15
    • 2020-08-12
    • 1970-01-01
    相关资源
    最近更新 更多