Я недавно узнал о некоторых внутренних std :: алгоритма
std :: advance получает тип числа «Расстояние», я полагаю, что его внутренняя реализация должна выглядеть так: (тег-диспетчеризация предлагается [Effective C ++])
template<class InputIt, class Distance>
void advance(InputIt& it, Distance n>
{
advance_impl(it, n, Iterator_trait<InputIt>::categary)
}
Iterator_trait должен помочь сделать тэг-рассылку и сообщить категории итератора, будь то произвольный доступ или последовательный
Таким образом, для категории произвольного доступа, «Impl» должен выглядеть
template<class InputIt, class Distance>
void advance_impl(InputIt& it, Distance n>
{
it = it +n
}
И для категории none-random_access, impl должен выглядеть следующим образом? (только мое предположение)
template<class InputIt, class Distance>
void advance_impl(InputIt& it, Distance n>
{
if(n==0)return
else if(n>0)
{
for(Distance d=0;d<n;++d)
++it
}
else
{
for(Distance d=0;d<n;++d)
--it;
}
}
Это только мое предположение, мне интересно, если реализация STL действительно нужно судить, если n = 0,> 0,<0 как для разных случаев.
Моя предполагаемая реализация должна быть слишком сложной.
Но что является более изящной реализацией, когда итератор не относится к категории произвольного доступа.
Я полагаю, что для цикла необходим там, как насчет знака «Расстояние»?
Задача ещё не решена.
Других решений пока нет …