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的时候会排序的