关于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); }}
你可以把该文件中的原来的两个对应的函数屏蔽调。经过这样修改,上面的我们的程序可以正确的运行了。你是不是心动了呢,去试试把。