C++ STL中SORT的自定义比较函数?

Posted

技术标签:

【中文标题】C++ STL中SORT的自定义比较函数?【英文标题】:Custom comparison function for SORT in C++ STL? 【发布时间】:2014-01-10 17:07:07 【问题描述】:

我正在使用

       typedef pair < long , pair <bool ,long > > t;
       vector <t> time ;

我需要使用std::sort() 函数对上述向量进行排序,但需要使用自定义的比较函数。我写了它的一个版本,但不能正常工作。你能指出我的错误吗?

     bool comp ( const t &a , const t &b)

         if ( a.first < b.first)
             return a.first > b.first ;
         else if ( b.first < a.first )
             return b.first > a.first ;
         else if ( a.first == b.first )
         
             if ( a.second.first == false && b.second.first == true)
                return a.first > b.first ;
             else if ( a.second.first == true && b.second.first == false)
                return b.first > a.first ;
             else
                return a.first > b.first ;
          
      


      inside main()
         sort ( time.begin() ,time.end() ,comp) ;
      

自定义案例:

排序前:向量时间

       10 1 1 
      100 0 1
      100 1 2
      200 0 2
      150 1 2
      500 0 2
      200 1 2
      300 0 2

排序后:

      10 1 1
      100 0 1
      100 1 2
      150 1 2
      200 0 2
      200 1 2
      300 0 2
      500 0 2

【问题讨论】:

这个问题可以使用英语描述来准确说明您需要如何对这些东西进行排序——即:是什么让t 比另一个“少”。代码似乎对这个问题有点困惑。 请正确缩进你的代码,目前不可读。 【参考方案1】:

应该是:

if ( a.first < b.first)
    return true
else if ( b.first < a.first )
    return false;
// etc.

在您的版本中,这两种情况都返回 false。

【讨论】:

澄清一下:如果a.first &lt; b.first 为真,那么a.first &gt; b.first 将为假(反之亦然),除非&lt;&gt; 的定义很奇怪。【参考方案2】:

您的比较函数没有定义排序。实际上, 它似乎随时返回 true a.first != b.first

我不确定您想要哪种自定义订单。标准 std::pair 的排序将导致类似:

bool
comp( t const& a, t const& b )

    if ( a.first != b.first )
        return a.first < b.first;
    else if ( a.second.first != b.second.first )
        return a.second.first < b.second.first;
    else 
        return a.second.second < b.second.second;

实际上有点复杂,因为唯一的比较 它使用的运算符是&lt;。但是如果&lt;!= 都是 可用,并且行为正常,结果与 多于。

您可以轻松地采用它来比较任何内容中的元素 你想要的订单;如果你想反转其中之一的顺序 元素,只需将 &lt; 替换为 &gt;

最后,false 比较小于 true 的布尔值 价值观。

【讨论】:

我会说它为 a.first != b.first 返回 false。 @KitFisto 在进一步研究它时,我会说它总是返回false。如果a.first == b.first,则所有返回路径也是a.first &gt; b.firstb.first &gt; a.first。 (我还是不明白他想做什么。)

以上是关于C++ STL中SORT的自定义比较函数?的主要内容,如果未能解决你的问题,请参考以下文章

c++ STL中的list容器用sort排序是,如何自定义比较

C++中定义比较函数的三种方法

对于一些stl自定义比较函数

初涉算法——STL初步

c++ STL sort struct comp

C++算法从std::sort到排序算法