ITPub博客

首页 > 应用开发 > IT综合 > 关于std::list的sort函数在VC6下的修正 (转)

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

原创 IT综合 作者:amyz 时间:2007-11-16 18:58:20 0 删除 编辑
关于std::list的sort函数在VC6下的修正 (转)[@more@]

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

徐岩柏XML:namespace prefix = o ns = "urn:schemas-microsoft-com:Office:office" />

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

#include

#include

#include

#include

 

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 mylist;

  std::list::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 <(*iter).ID << "t";

  }

  std::cout <

  return 0;

}

 

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

  typedef greater<_Ty> _Pr3;

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

  void sort(_Pr3 _Pr)

……..

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

 template
 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

    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); }}

 

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


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10752019/viewspace-982824/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论