中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 程序开发 > 编程语言 > Visual C++ > 综合文章
关于std::list的sort函数在VC6下的修正
作者:未知 时间:2003-07-14 12:12 出处:Blog 责编:chinaitpower
              摘要:关于std::list的sort函数在VC6下的修正

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

 

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

关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有