STL是C ++世界的重要组成部分,大多数实现源自Stepanov和Musser的初步努力。
我的问题是代码的关键性,它是人们出于敬畏和学习目的而查看编写良好的C ++示例的主要来源之一:为什么STL的各种实现如此令人讨厌地看待-令人费解的和从美学的角度讲,通常是很好的例子,说明如何不编写C ++代码。
下面的代码示例由于在变量命名,布局,宏以及使用运算符等方面的原因而无法在我工作过的地方通过代码审查,这些操作不仅仅需要一目了然才能弄清实际情况。
template<class _BidIt> inline
bool _Next_permutation(_BidIt _First, _BidIt _Last)
{ // permute and test for pure ascending, using operator<
_BidIt _Next = _Last;
if (_First == _Last || _First == --_Next)
return (false);
for (; ; )
{ // find rightmost element smaller than successor
_BidIt _Next1 = _Next;
if (_DEBUG_LT(*--_Next, *_Next1))
{ // swap with rightmost element that's smaller, flip suffix
_BidIt _Mid = _Last;
for (; !_DEBUG_LT(*_Next, *--_Mid); )
;
_STD iter_swap(_Next, _Mid);
_STD reverse(_Next1, _Last);
return (true);
}
if (_Next == _First)
{ // pure descending, flip all
_STD reverse(_First, _Last);
return (false);
}
}
}
_Ty operator()()
{ // return next value
static _Ty _Zero = 0; // to quiet diagnostics
_Ty _Divisor = (_Ty)_Mx;
_Prev = _Mx ? ((_Ity)_Ax * _Prev + (_Ty)_Cx) % _Divisor
: ((_Ity)_Ax * _Prev + (_Ty)_Cx);
if (_Prev < _Zero)
_Prev += (_Ty)_Mx;
return (_Prev);
}
请注意,我不会批评该界面,因为它的设计和适用性都很好。我担心的是实现细节的可读性。
先前已经提出过类似的问题:
注意:上面提供的代码来自MSVC 2010算法和队列头。