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

原创 2003年07月15日 07:18:00

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

徐岩柏<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

       你可能也在使用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); }}

 

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

std list/vector sort 自定义类的排序就是这么简单

网上江湖郎中和蒙古大夫很多,因此,此类帖子也很多。关于排序,我还真没研究过,看了江湖郎中和蒙古大夫的帖子,搞了半天不行,所以,自己研究了一下,如下:三种方式都可以,如重写容器中是对象时,用容器中是对象...
  • marising
  • marising
  • 2009年09月18日 17:58
  • 38785

STL sort原理及用法详解

排序的算法有很多种,在我们平时的编程中,我们很多时候会用的着排序,这些时候我们每次都要自己来实现吗?未必,C++标准模版库为我们提供了这样一个函数实现 sort(),用来满足我们日常对排序的需求。 ...
  • leo115
  • leo115
  • 2013年03月09日 18:45
  • 11406

list带参数的sort函数

#include #include #include #include #include #include #include #include #include #include #include #...
  • u010660276
  • u010660276
  • 2013年10月25日 22:55
  • 898

c++ stl sort函数奔溃问题

转载自新浪博客这位牛人一次stl sort调用导致的进程崩溃(zz) 此博文包含图片 (2012-10-08 10:06:24)转载▼ 标签: it 分类: 工作 近期我们开发的...
  • xiyuan1223
  • xiyuan1223
  • 2017年04月19日 20:56
  • 537

std::List的高级用法

std::list 学习 (本文内容均来自网络)  list::splice()函数详解 list::splice实现list拼接的功能。将源list的内容部分或全部元素删除,拼插入到...
  • lltaoyy
  • lltaoyy
  • 2012年03月20日 14:48
  • 6468

sort函数的第三个参数cmp

sort 函数的第三个参数 cmp
  • cmm0401
  • cmm0401
  • 2017年07月05日 20:50
  • 492

sort函数中三个参数的用法

1、sort函数一般只对数组元素排序,而且必须知道地址。如对a[0]到a[n-1]共n个元素进行排序,用sort(ar,ar+n)。其中n可以为1,即对一个元素也可以使用sort函数。 2、可以有如下...
  • lz465350
  • lz465350
  • 2014年02月20日 20:43
  • 3254

libcurl在vc6下的安装(这个狂赞的,按照以下步骤使用libcurl绝对没有问题)

libcurl在vc6下的安装(超赞)(http://blog.chinaunix.net/u/25096/showart_388890.html)libcurl是一个很好的库,免费开源的,客户端ur...
  • shuixin536
  • shuixin536
  • 2009年08月06日 22:13
  • 7281

C#中的 sort排序

sort 函数对数组中的数据进行升序排序,,(其中,sort函数有很多重载的形式,这里不再一一的说明) Reverse函数对数组中的数据进行降序排序,, [csharp] ...
  • jinsenianhua2012
  • jinsenianhua2012
  • 2014年09月11日 14:52
  • 2020

C++ list中erase和remove函数的用法

erase的作用是,使作为参数的迭代器失效,并返回指向该迭代器下一参数的迭代器。 如下: list ParticleSystem; list::iterator pointer; if...
  • ameyume
  • ameyume
  • 2013年03月24日 19:49
  • 11134
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:关于std::list的sort函数在VC6下的修正
举报原因:
原因补充:

(最多只允许输入30个字)