STL - это критически важный элемент мира C ++, большинство реализаций основано на первоначальных усилиях Степанова и Массера.
Мой вопрос дается критичность кода, и он является одним из основных источников, где люди могут просматривать примеры хорошо написанного C ++ как для трепета, так и для учебных целей: почему на различные реализации STL так противно смотреть - запутанные и в целом хорошие примеры того, как не писать код C ++ с эстетической точки зрения.
Приведенные ниже примеры кода не прошли проверку кода в тех местах, где я работал, по причинам, различающимся от именования переменных, макета и т.д. макросы и использование операторов, которые требуют большего, чем простой взгляд, чтобы понять, что на самом деле происходит.
template 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);
}
Обратите внимание, я не критикую интерфейс, так как он очень хорошо разработан и применим. Что меня беспокоит, так это удобочитаемость деталей реализации.
Подобные вопросы уже задавались ранее:
Существует ли читабельная реализация STL
Почему реализация STL так нечитаема? Как здесь можно было улучшить C ++?
Примечание: представленный выше код взят из алгоритма MSVC 2010 и заголовков очереди.