VC语言

本类阅读TOP10

·VC++ 学习笔记(二)
·用Visual C++打造IE浏览器(1)
·每个开发人员现在应该下载的十种必备工具
·教你用VC6做QQ对对碰外挂程序
·Netmsg 局域网聊天程序
·Windows消息大全
·VC++下使用ADO编写数据库程序
·VC++学习笔记(四)
·非法探取密码的原理及其防范
·怎样在VC++中访问、修改注册表

分类导航
VC语言Delphi
VB语言ASP
PerlJava
Script数据库
其他语言游戏开发
文件格式网站制作
软件工程.NET开发
关于std::list的sort函数在VC6下的修正

作者:未知 来源:月光软件站 加入时间:2005-2-28 月光软件站

关于std::listsort函数在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文件中的mergesort函数进行了修改,具体代码如下:

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

 

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




相关文章

相关软件