分享
 
 
 

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

王朝vc·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

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

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

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有