Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
template_metaprogramming_ru.docx
Скачиваний:
12
Добавлен:
01.07.2025
Размер:
774.38 Кб
Скачать

Двунаправленные

Двунаправленный итератор – прямой итератор с дополнительной способностью обходить последовательность в обратную сторону. Двунаправленный итератор может быть либо уменьшаемым, либо ссылаться на начало последовательности.

Метафункция mpl::prior приводит итератор к предыдущему положению в последовательности. Автор метафункции уменьшения итератора может специализировать mpl::prior для поддержки своего типа итератора или использовать реализацию по умолчанию для получения доступа к предыдущему элементу последовательности:

namespace boost {

namespace mpl {

template <class It> struct prior

{

typedef typename It::prior type;

};

}

}

Требования MPL для двунапраленных итераторов, где i - модель двунаправленного итератора.

Expression

Result

Assertion/Precondition

mpl:: next<i>::type

A Bidirectional Iterator.

mpl::prior< mpl::next<i>::type >::type is equivalent to i. Precondition: i is incrementable.

mpl:: prior<i>::type

A Bidirectional Iterator.

Precondition: i is decrementable.

i::category

Convertible to mpl:: bidirectional_iterator_tag.

Произвольные

Итератор произвольного доступа - двунаправленный итератор, который также обеспечивает движение с произвольной величиной шага вперед или назад, измеряет расстояния между итераторами одной последовательности за постоянное время работы.

Обход последовательности произвольноых итераторм выполняется метафункцией mpl::advance, которая, принимает произвольный иератора i и целочисленную константный n (величина смещения), возвращает смещенный итератор для данной последовательности.

Измерение расстояния выполняется метафункцией mpl::distance, которая, принимает 2 итератора произвольного доступа i и j одной последовательности, возвращает количество позиций между ними. Эта метафункция также выполняется за постоянное время.

Эти две операции сильно связаны:

mpl::advance<i, mpl::distance<i,j>::type>::type

Эти функции эквиваленты своим аналогам из STL, выполняются с линейной сложностью. Реализацию по умолчанию вызывает столько раз метафункции mpl::next или mpl::prior сколько необходимо для смещени итератора. Автор итератора произвольного доступа должен специализировать метафункции advance и distance для типа своего итератора, чтобы работа выполнялась за постоянное время, или он не будет соответствовать требованиям.

Имена i и j представляют итераторы одной последовательности, N представляет тип целочисленной константу, а n – «N::value».

Expression

Result

Assertion/Precondition

mpl::next<i>::type

A Random Access Iterator.

Precondition: i is incrementable.

mpl::prior<i>::type

A Random Access Iterator.

Precondition: i is decrementable.

mpl::advance< i, N >::type

If n>0 , equivalent to n applications of mpl::next to i. Otherwise, equivalent to -n applications of mpl::prior to i.

Constant time. mpl::advance< i , mpl::distance< i,j >::type >::type is equivalent to j.

mpl::distance< i, j >::type

An integral constant wrapper.

Constant time.

i::category

Convertible to mpl::random_ access_iterator_tag.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]