C ++ STL中SORT的自定义比较功能?

时间:2014-01-10 17:07:08

标签: c++ sorting stl

我正在使用

       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

2 个答案:

答案 0 :(得分:3)

应该是:

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

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

答案 1 :(得分:1)

您的比较功能没有定义排序。事实上, 它似乎随时都会返回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;
}

实际上它有点复杂,因为唯一的比较 它使用的运算符是<。但如果<!=都是。{ 可用,并且表现正常,结果与 以上。

你可以轻松地采用它来比较任何元素 你想要的订单;如果你想反转其中一个的顺序 元素,只需将<替换为>

最后,false比布尔值小于true 值。