首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

list:sort

2012-02-17 
list::sort求助SGI的代码//Donothingifthelisthaslength0or1.if(_M_node- _M_next!_M_node&&_M_node- _

list::sort求助
SGI的代码
//   Do   nothing   if   the   list   has   length   0   or   1.
    if   (_M_node-> _M_next   !=   _M_node   &&   _M_node-> _M_next-> _M_next   !=   _M_node)   {
        list <_Tp,   _Alloc>   __carry;
        list <_Tp,   _Alloc>   __counter[64];
        int   __fill   =   0;
        while   (!empty())   {
            __carry.splice(__carry.begin(),   *this,   begin());
            int   __i   =   0;
            while(__i   <   __fill   &&   !__counter[__i].empty())   {
                __counter[__i].merge(__carry);                               //这里
                __carry.swap(__counter[__i++]);                             //和这里
            }
            __carry.swap(__counter[__i]);                  
            if   (__i   ==   __fill)   ++__fill;
        }  

        for   (int   __i   =   1;   __i   <   __fill;   ++__i)
            __counter[__i].merge(__counter[__i-1]);
        swap(__counter[__fill-1]);
    }

标记的那两行看不懂,为什么要先merge在swap,我把那两行改成
__carry.merge(__counter[__i++]);
几个测试的例子都没出bug,好吧,就算是作者一时疏忽,看VC用的STL

while   (!empty())
{_X.splice(_X.begin(),   *this,   begin());
size_t   _I;
for   (_I   =   0;   _I   <   _N   &&   !_A[_I].empty();   ++_I)
{_A[_I].merge(_X);               //这里
_A[_I].swap(_X);   }               //和这里
if   (_I   ==   _MAXN)
_A[_I].merge(_X);
else
{_A[_I].swap(_X);
if   (_I   ==   _N)
++_N;   }}
while   (0   <   _N)
merge(_A[--_N]);   }}

那两行还是先merge在swap,虽然swap就是交换了2个指针,不过为什么要多此一举,毕竟两个都是作为中介的链表,而且多一次函数调用,压栈出栈都是好几条指令。不明白。

[解决办法]
merge的时候会排序的

热点排行