关于std::list的sort函数在VC6下的修正

类别:VC语言 点击:0 评论:0 推荐:
关于std::list的sort函数在VC6下的修正

徐岩柏

       你可能也在使用c++的标准程序库,是不是感觉很好?本人在做项目的过程中发现这样的一个问题,我的list中保存的是一个个对象,我在使用该列表的过程中要依据对象的一个关键字进行排序。你可能会说:这还不容易吗!list 中有个sort函数就可以完成。不错,标准c++当然支持自定义算子排序函数,如果你用vc7 或g++ 就没有问题了,如果你是使用vc6.0如下的程序代码就不能编译:

#include <list>

#include <string>

#include <functional>

#include <iostream>

 

struct S {

       std::string firstname;

       std::string secondname;

       int ID;

};

struct comp{

public:

       bool operator()(S& a,S& b)

       {

              return a.ID < b.ID;

       }

};

int main(int argc, char* argv[])

{

       std::list<S> mylist;

       std::list<S>::iterator iter;

       S a;

       a.firstname ="dfadf";

       a.ID = 5;

       mylist.push_back (a);

      

       a.firstname ="得到";

       a.ID = 9;

       mylist.push_back (a);

      

       a.firstname ="xxx";

       a.ID = 7;

       mylist.push_back (a);

      

       a.firstname ="gggg";

       a.ID = 25;

       mylist.push_back (a);

 

       mylist.sort(comp());

       for (iter = mylist.begin(); iter != mylist.end();++iter)

       {

              std::cout <<static_cast<S>(*iter).ID << "\t";

       }

       std::cout <<std::endl;  

       return 0;

}

 

本人对list文件观察发现,有这样一行

       typedef greater<_Ty> _Pr3;

 而它的sort函数也正是使用了该定义算子。

       void sort(_Pr3 _Pr)

……..

难怪我们的程序不能使用自己的比较算子函数comp 。经过这么一分析,我们要想使用该功能,就必须对该定义做修改,要知道vc6中的stl系列文件都是1998年前的老古董了,看起来没有竞争对软件的发展是不利的。本人对list文件中的merge和sort函数进行了修改,具体代码如下:

  template <typename _StrictWeakOrdering>
  merge(_Myt& _X, _StrictWeakOrdering __comp)
  {if (&_X != this)
  {iterator _F1 = begin(), _L1 = end();
  iterator _F2 = _X.begin(), _L2 = _X.end();
  while (_F1 != _L1 && _F2 != _L2)
   if (__comp(*_F2, *_F1))
   {iterator _Mid2 = _F2;
   _Splice(_F1, _X, _F2, ++_Mid2);
   _F2 = _Mid2; }
   else
    ++_F1;
   if (_F2 != _L2)
    _Splice(_L1, _X, _F2, _L2);
   _Size += _X._Size;
   _X._Size = 0; }}

         template <typename _Ordering>

                  sort(_Ordering __comp)

    {

                            if (2 <= size())

                            {const size_t _MAXN = 15;

                            _Myt _X(allocator), _A[_MAXN + 1];

                            size_t _N = 0;

                            while (!empty())

                            {_X.splice(_X.begin(), *this, begin());

                            size_t _I;

                            for (_I = 0; _I < _N && !_A[_I].empty(); ++_I)

                            {_A[_I].merge(_X, __comp);

                            _A[_I].swap(_X); }

                            if (_I == _MAXN)

                                     _A[_I].merge(_X, __comp);

                            else

                            {_A[_I].swap(_X);

                            if (_I == _N)

                                     ++_N; }}

                            while (0 < _N)

                                     merge(_A[--_N], __comp); }}

 

你可以把该文件中的原来的两个对应的函数屏蔽调。经过这样修改,上面的我们的程序可以正确的运行了。你是不是心动了呢,去试试把。

本文地址:http://com.8s8s.com/it/it1616.htm