stl sort使用经验

本文介绍C++中list和vector容器的排序方法,包括基本数据类型和自定义对象类型的排序过程,并演示如何通过重载比较运算符来实现自定义对象的排序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.list 里有个方法sort方法。注意Vector很多方法和list一样,但是,这个方法Vector是没有的。

  (1).整型数据排序 

   void ListSortTest()
{
    list<int> num;
    num.push_back( 1 );
    num.push_back( 3 );
    num.push_back( 2 );
    num.push_back( 9 );
    num.push_back( 5 );
    num.sort();
    list<int>::iterator vi;
    for( vi=num.begin();vi!=num.end();vi++) 
    {
        cout  << *vi << endl;
    } 
}

(2).对象排序。因为list.sort()默认排序需要重载<操作符。所以我们必须在类对象里重载这个操作符。例子如下:

class student
 {
    public:
      int age;
      student()
      {}
      student(int a)
      {
          this->age=a;
      }
  public:
      bool operator < (student b)
     {
           return this->age < b.age;
     }

     bool operator > (student b)
     {
           return this->age > b.age;
     } 

 }; 

测试函数

void  ListSortTest()
{
    list < student >  num;
    num.push_back( student( 1 ) );
    num.push_back( student( 5 ));
    num.push_back( student( 2 ));
    num.push_back( student( 6 ));
    num.sort();
    //  sort(num.begin(),num.end());
    list < student > ::iterator vi;

     for ( vi = num.begin();vi != num.end();vi ++ ) 
    {
        cout   <<  vi -> age  <<  endl;
    }
    num.clear();
    
}

  事实上,list有两个版本的sort成员函数:   
  一个是不带参数的sort(),用来实现升序排列;   
  另一个是带参数的sort(greater<T>   pr),用来实现降序排列。   
  后者的greater实际上是被VC实作好的一个二元函数(binary   funtion)对象,   
  参见VC下的源程序:   
  template<class   _Ty>   
  struct   greater   :   binary_function<_Ty,   _Ty,   bool>   {   
  bool   operator()(const   _Ty&   _X,   const   _Ty&   _Y)   const   
  {return   (_X   >   _Y);   }   
  };   
  而这个二元函数的成员操作符()将会调用其参数所对应的数据类型(这里正是student)的">"运算符进行相互比较。  

void  ListSortTest()
{
    list < student >  num;
    num.push_back( student( 1 ) );
    num.push_back( student( 5 ));
    num.push_back( student( 2 ));
    num.push_back( student( 6 ));
    list < student > ::iterator vi;
  greater < student >  pt;
  num.sort(pt);

     for ( vi = num.begin();vi != num.end();vi ++ )
    {
        cout   <<  vi -> age  <<  endl;
    }
    num.clear();
    
}

 

 

List<string>要进行排序的话,就不能这么排序。我原先以为是不能排序,后来发现是没有引用都文件,如果包含头文件sting后,就能够使用了。

 

2. Algorithms的Sort方法

void sort( iterator start, iterator end ); 

void sort( iterator start, iterator end, StrictWeakOrdering cmp );

bool cmp(int a,int b)
{
    return a > b;

void VectorTest()
{
    vector<int> num;
    num.push_back( 1 );
    num.push_back( 2 );
    num.push_back( 3 );
    num.push_back( 2 );
    num.push_back( 9 );
    num.push_back( 5 );
    sort(num.begin(),num.end());
    
    sort(num.begin(),num.end(),cmp);
    vector<int>::iterator vi;

    for( vi=num.begin();vi!=num.end();vi++) 
    {
        cout  << *vi << endl;
    } 

}

而这也就实现了Vector的排序功能。 

list如何实现Algorithms里的sort方法?目前还不知道。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值