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

Преобразования

Алгоритм преобразования MPL – алгоритм, создающий новую последовательность, в результате выполнения действий с элементами исходной последовательности.

Типичный алгоритм преобразования принимает одну или несколько входных последовательностей и метафункцию преобразования или предикат, а возвращает новую последовательность, созданную в соответствии с семантикой алгоритма и посредством инсертера (Inserter), который выполняет роль, аналогичную выходному итератору времени выполнения.

Для каждый алгоритма преобразования есть его реверсный аналог, с префиксом reverse_, который выполняет преобразования в обратном порядке.

copy

Фомрат:

template

<

typename Sequence,

typename In = unspecified

>

struct copy

{

typedef unspecified type;

};

Описание:

Возвращает копию исходной последовательности. [Эта формулировка относится к вариантам алгоритма без использования инсертера.]

Заголовок:

#include <boost/mpl/copy.hpp>

Параметры:

Выражение

Требование

Описание

Sequence

Прямая последовательность

Последовательность для копирования.

In

Инсертер (механизм вставки)

Инсертер.

Семантика выражений:

Поддерживает семантику, определенную для реверсного алгоритма, добавляет отличные/не определенные выражения.

Для любой прямой последовательности s и инсертера in:

typedef copy<s,in>::type r;

Возвращаемый тип: тип.

Семантика: эквивалентно

typedef fold<s, in::state, in::operation>::type r;

Сложность:

Линейная. Время работы прямо пропорционально значению размера

size<s>::value

Пример:

int main()

{

typedef mpl::vector_c<int,0,1,2,3,4,5,6,7,8,9> numbers;

typedef mpl::copy<

mpl::range_c<int,10,20>,

mpl::back_inserter< numbers >

>::type result;

BOOST_MPL_ASSERT_RELATION( mpl::size<result>::value, ==, 20 );

BOOST_MPL_ASSERT(( mpl::equal< result, mpl::range_c<int,0,20>> ));

return 0;

}

Смотри также:

Transformation Algorithms, Reversible Algorithm, reverse_copy, copy_if, transform

copy_if

Фомрат:

template

<

typename Sequence,

typename Pred,

typename In = unspecified

>

struct copy_if

{

typedef unspecified type;

};

Описание:

Возвращает проверенную копию исходной последовательности. Копия содержит элементы, для которых предикат Pred вернул правду. [Эта формулировка относится к вариантам алгоритма без использования инсертера.]

Заголовок:

#include <boost/mpl/copy_if.hpp>

Параметры:

Выражение

Требование

Описание

Sequence

Прямая последовательность

Последовательность для копирования.

Pred

Унарное лямбда-выражение

Условие копирования.

In

Инсертер (механизм вставки)

Инсертер.

Семантика выражений:

Поддерживает семантику, определенную для реверсного алгоритма, добавляет отличные/не определенные выражения.

Для любой прямой последовательности s, унарного лямбда-выражения pred и инсертера in:

typedef copy_if<s,pred,in>::type r;

Возвращаемый тип: тип.

Семантика: эквивалентно

typedef lambda<pred>::type p;

typedef lambda<in::operation>::type op;

typedef fold<

s,

in::state,

eval_if<

apply_wrap1<p, _2>,

apply_wrap2<op, _1, _2>,

identity<_1>

>

>::type r;

Сложность:

Линейная. Время работы прямо пропорционально значению размера

size<s>::value

Пример:

int main()

{

typedef mpl::copy_if<

mpl::range_c<int,0,10>,

mpl::less<

mpl::_1,

int_<5>

>,

mpl::back_inserter< mpl::vector<> >

>::type result;

BOOST_MPL_ASSERT_RELATION( mpl::size<result>::value, ==, 5 );

BOOST_MPL_ASSERT(( mpl::equal<result, mpl::range_c<int,0, 5>> ));

return 0;

}

Смотри также:

Transformation Algorithms, Reversible Algorithm, reverse_copy_if, copy, remove_if, replace_if

transform

Фомрат:

template

<

typename Seq,

typename Op,

typename In = unspecified

>

struct transform

{

typedef unspecified type;

};

template

<

typename Seq1,

typename Seq2,

typename BinaryOp,

typename In = unspecified

>

struct transform

{

typedef unspecified type;

};

Описание:

Алгоритм transform имеет несколько перегруженных версий:

  • transform<Seq,Op>: возвращает преобразованную копию исходной последовательности, полученную посредством применения унарного преобразования Op к каждому элементу в диапазоне

[begin<Sequence>::type, end<Sequence>::type)

  • transform<Seq1,Seq2,Op>: возвращает новую последовательность, полученную путем применения бинарного преобразования BinaryOp для пары элементов (e1, e21) из соответствующих диапазонов

[begin<Seq1>::type, end<Seq1>::type)

и

[begin<Seq2>::type, end<Seq2>::type)

[Эта формулировка относится к алгоритмам, не использующим инсертер.]

Заголовок:

#include <boost/mpl/transform.hpp>

Модель:

  • Реверсный алгоритм.

Параметры:

Выражение

Требование

Описание

Sequence, Seq1, Seq2

Прямая последовательность

Последовательности для преобразования.

Op, BinaryOp

Лямбда-выражение

Преобразование.

In

Инсертер (механизм вставки)

Инсертер.

Семантика выражений:

Поддерживает семантику, определенную для реверсного алгоритма, добавляет отличные/не определенные выражения.

Для любых прямых последовательностей s, s1 и s2, лямбда выражения op и op2, инсертера in:

typedef transform<s,op,in>::type r;

Возвращаемый тип: тип.

Семантика: эквивалентно

typedef lambda<op>::type f;

typedef lambda<in::operation>::type in_op;

typedef fold<

s,

in::state,

bind<

in_op,

_1,

bind<f, _2>

>

>::type r;

2:

typedef transform<s1,s2,op,in>::type r;

Возвращаемый тип: тип.

Постусловие: эквивалентно

typedef lambda<op2>::type f;

typedef lambda<in::operation>::type in_op;

typedef fold<

pair_view<s1,s2>,

in::state,

bind<

in_op,

_1,

bind<

f,

bind<first<>, _2>,

bind<second<>,_2>

>

>

>::type r;

Сложность:

Линейная. Колиество применений op/op2 пропорционально значениям размера

size<s>::value

size<s1>::value

Пример:

int main()

{

typedef mpl::vector<char,short,int,long,float,double> types;

typedef mpl::vector<char*,short*,int*,long*,float*,double*> pointers;

typedef mpl::transform<types,boost::add_pointer<mpl::_1>>::type result;

BOOST_MPL_ASSERT(( mpl::equal<result, pointers> ));

return 0;

}

Смотри также:

Transformation Algorithms, Reversible Algorithm, reverse_transform, copy, replace_if

replace

Фомрат:

template

<

typename Sequence,

typename OldType,

typename NewType,

typename In = unspecified

>

struct replace

{

typedef unspecified type;

};

Описание:

Возвращает копию исходной последовательности, в который каждый тип OldType заменяется типом NewType. [Эта формулировка относится к вариантам алгоритма без использования инсертера.]

Заголовок:

#include <boost/mpl/replace.hpp>

Модель:

  • Реверсный алгоритм.

Параметры:

Выражение

Требование

Описание

Sequence

Прямая последовательность

Исходная последовательность.

OldType

Любой тип

Тип, который заменяется новым типом.

NewType

Любой тип

Тип, который меняет старый тип.

In

Инсертер (механизм вставки)

Инсертер.

Семантика выражений:

Поддерживает семантику, определенную для реверсного алгоритма, добавляет отличные/не определенные выражения.

Для любой прямой последовательности s, инсертера in, произвольных типов x и y:

typedef replace<s,x,y,in>::type r;

Возвращаемый тип: тип.

Семантика: эквивалентно

typedef replace_if< s,y,is_same<_,x>,in >::type r;

Сложность:

Линейная. Количество сравнений на идентчиность/вставку пропорционально значению размера

size<s>::value

Пример:

int main()

{

typedef mpl::vector<int,float,char,float,float,double> types;

typedef mpl::vector<int,double,char,double,double,double> expected;

typedef mpl::replace< types,float,double >::type result;

BOOST_MPL_ASSERT(( mpl::equal<result, expected > ));

return 0;

}

Смотри также:

Transformation Algorithms, Reversible Algorithm, reverse_replace, replace_if, remove, transform

replace_if

Фомрат:

template

<

typename Sequence,

typename Pred,

typename In = unspecified

>

struct replace_if

{

typedef unspecified type;

};

Описание:

Возвращает копию исходной последовательности, в который каждый тип, для которого предикат Pred возвращает правду, заменяется типом NewType. [Эта формулировка относится к вариантам алгоритма без использования инсертера.]

Заголовок:

#include <boost/mpl/replace_if.hpp>

Модель:

  • Реверсный алгоритм.

Параметры:

Выражение

Требование

Описание

Sequence

Прямая последовательность

Исходная последовательность.

Pred

Унарное лямбда-выражение

Условие замены.

NewType

Любой тип

Тип, который меняет старый тип.

In

Инсертер (механизм вставки)

Инсертер.

Семантика выражений:

Поддерживает семантику, определенную для реверсного алгоритма, добавляет отличные/не определенные выражения.

Для любой прямой последовательности s, унарного лямбда-выражения pred, инсертера in, произвольного типа x:

typedef replace_if<s,pred,x,in>::type r;

Возвращаемый тип: тип.

Семантика: эквивалентно

typedef lambda<pred>::type p;

typedef transform< s, if_< apply_wrap1<p,_1>,x,_1>, in >::type r;

Сложность:

Линейная. Количество применений pred пропорционально значению размера

size<s>::value

количество вставок, не превышает значение размера.

Пример:

int main()

{

typedef mpl::vector_c<int,1,4,5,2,7,5,3,5> numbers;

typedef mpl::vector_c<int,1,4,0,2,0,0,3,0> expected;

typedef mpl::replace_if<

numbers,

mpl::greater<

mpl::_, // поочередно подставляются все элементы

mpl::int_<4> // если больше 4 == правда

>,

mpl::int_<0> // если greater == правда, меняет значение на 0

>::type result;

BOOST_MPL_ASSERT

((

mpl::equal<

result,

expected,

mpl::equal_to<mpl::_, mpl::_> // сравнивает каждый с каждым

>

));

return 0;

}

Смотри также:

Transformation Algorithms, Reversible Algorithm, reverse_replace_if, replace, remove_if, transform

remove

Фомрат:

template

<

typename Sequence,

typename T,

typename In = unspecified

>

struct remove

{

typedef unspecified type;

};

Описание:

Возвращает новую последовательность, состоящую из всех элементов диапазона

[begin<Sequence>::type, end<Sequence>::type)

за исключением элементов, идентичных типу T.

[Эта формулировка относится к вариантам алгоритма без использования инсертера.]

Заголовок:

#include <boost/mpl/remove.hpp>

Модель:

  • Реверсный алгоритм.

Параметры:

Выражение

Требование

Описание

Sequence

Прямая последовательность

Исходная последовательность.

T

Любой тип

Тип, который заменяется новым типом.

In

Инсертер (механизм вставки)

Инсертер.

Семантика выражений:

Поддерживает семантику, определенную для реверсного алгоритма, добавляет отличные/не определенные выражения.

Для любой прямой последовательности s, инсертера in, произвольного типа x:

typedef remove<s,x,in>::type r;

Возвращаемый тип: тип.

Семантика: эквивалентно

typedef remove_if< s,is_same<_,x>,in >::type r;

Сложность:

Линейная. Количество сравнений на идентчиность/вставку пропорционально значению размера

size<s>::value

Пример:

int main()

{

typedef mpl::vector<int,float,char,float,float,double>::type types;

typedef mpl::remove< types,float >::type result;

BOOST_MPL_ASSERT(( mpl::equal< result, mpl::vector<int,char,double>> ));

return 0;

}

Смотри также:

Transformation Algorithms, Reversible Algorithm, reverse_remove, remove_if, copy, replace

remove_if

Фомрат:

template

<

typename Sequence,

typename Pred,

typename In = unspecified

>

struct remove_if

{

typedef unspecified type;

};

Описание:

Возвращает новую последовательность, состоящую из всех элементов диапазона

[begin<Sequence>::type, end<Sequence>::type)

за исключением элементов, для которых предикат Pred возвращает правду.

[Эта формулировка относится к вариантам алгоритма без использования инсертера.]

Заголовок:

#include <boost/mpl/remove_if.hpp>

Модель:

  • Реверсный алгоритм.

Параметры:

Выражение

Требование

Описание

Sequence

Прямая последовательность

Исходная последовательность.

Pred

Унарное лямбда-выражение

Условие замены.

In

Инсертер

Инсертер.

Семантика выражений:

Поддерживает семантику, определенную для реверсного алгоритма, добавляет отличные/не определенные выражения.

Для любой прямой последовательности s, инсертера in, унарного лямбда-выражения pred:

typedef remove_if<s,pred,in>::type r;

Возвращаемый тип: тип.

Семантика: эквивалентно

typedef lambda<pred>::type p;

typedef lambda<in::operation>::type op;

typedef fold<

s,

in::state,

eval_if<

apply_wrap1<p,_2>,

identity<_1>,

apply_wrap2<op,_1,_2>

>

>::type r;

Сложность:

Линейная. Количество применений pred пропорционально значению размера

size<s>::value

количество вставок, не превышает значение размера.

Пример:

int main()

{

typedef mpl::vector_c<int,1,4,5,2,7,5,3,5>::type numbers;

typedef mpl::remove_if<

numbers,

mpl::greater<

mpl::_,

mpl::int_<4>

>

>::type result;

BOOST_MPL_ASSERT

((

mpl::equal<

result,

mpl::vector_c<int,1,4,2,3>,

mpl::equal_to<mpl::_,mpl::_>

>

));

return 0;

}

Смотри также:

Transformation Algorithms, Reversible Algorithm, reverse_remove_if, remove, copy_if, replace_if

unique

Фомрат:

template

<

typename Seq,

typename Pred,

typename In = unspecified

>

struct unique

{

typedef unspecified type;

};

Описание:

Возвращает новую последовательность, в которой каждый тип элемента является уникальным, все дубликаты удалены.

[Эта формулировка относится к вариантам алгоритма без использования инсертера.]

Заголовок:

#include <boost/mpl/unique.hpp>

Модель:

  • Реверсный алгоритм.

Параметры:

Выражение

Требование

Описание

Sequence

Прямая последовательность

Исходная последовательность.

Pred

Бинарное лямбда-выражение

Отношение эквивалентности.

In

Инсертер (механизм вставки)

Инсертер.

Семантика выражений:

Поддерживает семантику, определенную для реверсного алгоритма, добавляет отличные/не определенные выражения.

Для любой прямой последовательности s, бинарного лямбда-выражения pred, инсертера in:

typedef unique<s,pred,in>::type r;

Возвращаемый тип: тип.

Семантика: если

size<s>::value <= 1

то, эквивалентно:

typedef copy<s,in>::type r;

иначе, эквивалентно:

typedef lambda<pred>::type p;

typedef lambda<in::operation>::type in_op;

typedef apply_wrap2<

in_op,

in::state,

front<types>::type

>::type in_state;

typedef fold<

s,

pair< in_state, front<s>::type >,

eval_if<

apply_wrap2<p, second<_1>, _2>,

identity< first<_1>

>,

apply_wrap2<in_op, first<_1>, _2>

>

>::type::first r;

Сложность:

Линейная. Количество сравнений на идентчиность/вставку пропорционально значению размера

size<s>::value - 1

Пример:

int main()

{

typedef mpl::vector<int,float,float,char,int,int,int,double> types;

typedef mpl::vector<int,float,char,int,double> expected;

typedef mpl::unique< types, boost::is_same<mpl::_1, mpl::_2> >::type result;

BOOST_MPL_ASSERT(( mpl::equal< result, expected > ));

return 0;

}

Смотри также:

Transformation Algorithms, Reversible Algorithm, reverse_unique, remove, copy_if, replace_if

partition

Фомрат:

template

<

typename Seq,

typename Pred,

typename In1 = unspecified,

typename In2 = unspecified

>

struct partition

{

typedef unspecified type;

};

Описание:

Возвращает пару последовательностей, которые вместе содержат все элементы в диапазоне

[begin<Seq>::type, end<Seq>::type)

разделенные на две группы, в соответствии с предикатом Pred. partition – синоним stable_partition.

[Эта формулировка относится к вариантам алгоритма без использования инсертера.]

Заголовок:

#include <boost/mpl/partition.hpp>

Модель:

  • Реверсный алгоритм.

Параметры:

Выражение

Требование

Описание

Seq

Прямая последовательность

Исходная последовательность.

Pred

Унарное лямбда-выражение

Предикат разделения.

In1, In2

Инсертер (механизм вставки)

Инсертеры вывода.

Семантика выражений:

Поддерживает семантику, определенную для реверсного алгоритма, добавляет отличные/не определенные выражения.

Для любой прямой последовательности s, унарного лямбда-выражения pred, инсертеров in1, in2:

typedef partition<s,pred,in1,in2>::type r;

Возвращаемый тип: пара.

Семантика: эквивалентно

typedef stable_partition<s,pred,in1,in2>::type r;

Сложность:

Линейная. Количество применений предиката pred и суммарных обращений к in1::operation / in2::operation пропорционально значению размера

size<s>::value

Пример:

template< typename N >

struct is_odd

: mpl::bool_<(N::value % 2)>

{};

int main()

{

typedef mpl::partition<

mpl::range_c<int,0,10>,

is_odd<mpl::_1>,

mpl::back_inserter< mpl::vector<> >,

mpl::back_inserter< mpl::vector<> >

>::type r;

BOOST_MPL_ASSERT(( mpl::equal< r::first, mpl::vector_c<int,1,3,5,7,9>> ));

BOOST_MPL_ASSERT(( mpl::equal< r::second, mpl::vector_c<int,0,2,4,6,8>> ));

return 0;

}

Смотри также:

Transformation Algorithms, Reversible Algorithm, reverse_partition, stable_partition, sort

stable_partition

Фомрат:

template

<

typename Seq,

typename Pred,

typename In1 = unspecified,

typename In2 = unspecified

>

struct stable_partition

{

typedef unspecified type;

};

Описание:

Возвращает пару последовательностей, которые вместе содержат все элементы в диапазоне

[begin<Seq>::type, end<Seq>::type)

разделенные на две группы, в соответствии с предикатом Pred. stable_partition гарантирует сохранение относительной упорядоченности в результирующей последовательности.

[Эта формулировка относится к вариантам алгоритма без использования инсертера.]

Заголовок:

#include <boost/mpl/stable_partition.hpp>

Модель:

  • Реверсный алгоритм.

Параметры:

Выражение

Требование

Описание

Seq

Прямая последовательность

Исходная последовательность.

Pred

Унарное лямбда-выражение

Предикат разделения.

In1, In2

Инсертер (механизм вставки)

Инсертеры вывода.

Семантика выражений:

Поддерживает семантику, определенную для реверсного алгоритма, добавляет отличные/не определенные выражения.

Для любой прямой последовательности s, унарного лямбда-выражения pred, инсертеров in1, in2:

typedef stable_partition<s,pred,in1,in2>::type r;

Возвращаемый тип: пара.

Семантика: эквивалентно

typedef lambda<pred>::type p;

typedef lambda<in1::operation>::type in1_op;

typedef lambda<in2::operation>::type in2_op;

typedef fold<

s,

pair< in1::state, in2::state >,

if_<

apply_wrap1<p,_2>,

pair<

apply_wrap2<

in1_op,

first<_1>,

_2>,

second<_1>

>,

pair<

first<_1>,

apply_wrap2<

in2_op,

second<_1>,

_2

>

>

>

>::type r;

Сложность:

Линейная. Количество применений предиката pred и суммарных обращений к in1::operation / in2::operation пропорционально значению размера

size<s>::value

Пример:

template< typename N >

struct is_odd

: mpl::bool_<(N::value % 2)>

{};

int main()

{

typedef mpl::stable_partition<

mpl::range_c<int,0,10>,

is_odd<mpl::_1>,

mpl::back_inserter< mpl::vector<> >,

mpl::back_inserter< mpl::vector<> >

>::type r;

BOOST_MPL_ASSERT(( mpl::equal< r::first, mpl::vector_c<int,1,3,5,7,9> > ));

BOOST_MPL_ASSERT(( mpl::equal< r::second, mpl::vector_c<int,0,2,4,6,8> > ));

return 0;

}

Смотри также:

Transformation Algorithms, Reversible Algorithm, reverse_stable_partition, partition, sort, transform

sort

Фомрат:

template

<

typename Seq,

typename Pred = less<_1,_2>,

typename In = unspecified

>

struct sort

{

typedef unspecified type;

};

Описание:

Возвращает новую последовательность всех элементы в диапазоне

[begin<Seq>::type, end<Seq>::type)

отсортированных в соответствии с предикатом отношения упорядочения Pred.

[Эта формулировка относится к вариантам алгоритма без использования инсертера.]

Заголовок:

#include <boost/mpl/sort.hpp>

Модель:

  • Реверсный алгоритм.

Параметры:

Выражение

Требование

Описание

Seq

Прямая последовательность

Исходная последовательность.

Pred

Бинарное лямбда-выражение

Предикат разделения.

In

Инсертер (механизм вставки)

Инсертер.

Семантика выражений:

Поддерживает семантику, определенную для реверсного алгоритма, добавляет отличные/не определенные выражения.

Для любой прямой последовательности s, бинарного лямбда-выражения pred, инсертера in:

typedef sort<s,pred,in>::type r;

Возвращаемый тип: тип.

Семантика: если

size<s>::value <= 1

то, эквивалентно:

typedef copy<s,in>::type r;

иначе, эквивалентно:

typedef back_inserter< vector<> > aux_in;

typedef lambda<pred>::type p;

typedef begin<s>::type pivot;

typedef partition<

iterator_range<

next<pivot>::type,

end<s>::type

>,

apply_wrap2<p,_1,deref<pivot>::type>,

aux_in,

aux_in

>::type partitioned;

typedef sort<partitioned::first,p,aux_in >::type part1;

typedef sort<partitioned::second,p,aux_in >::type part2;

typedef copy<

joint_view<

joint_view<

part1,

single_view< deref<pivot>::type >

>,

part2

>,

in

>::type r;

Сложность:

В среденем O(n log(n)), если

n == size<s>::value

в худшем случае – квадратичное.

Пример:

int main()

{

typedef mpl::vector_c<int,3,4,0,-5,8,-1,7> numbers;

typedef mpl::vector_c<int,-5,-1,0,3,4,7,8> expected;

typedef mpl::sort<numbers>::type result;

BOOST_MPL_ASSERT

((

mpl::equal<

result,

expected,

mpl::equal_to<mpl::_,mpl::_>

>

));

return 0;

}

Смотри также:

Transformation Algorithms, Reversible Algorithm, partition

reverse

Фомрат:

template

<

typename Sequence,

typename In = unspecified

>

struct reverse

{

typedef unspecified type;

};

Описание:

Возвращает реверсную копию исходной последовательности. reverse –синоним reverse_copy.

[Эта формулировка относится к вариантам алгоритма без использования инсертера.]

Заголовок:

#include <boost/mpl/reverse.hpp>

Модель:

  • Реверсный алгоритм.

Параметры:

Выражение

Требование

Описание

Sequence

Прямая последовательность

Последовательность для разворота.

In

Инсертер (механизм вставки)

Инсертер.

Семантика выражений:

Для любой прямой последовательности s, инсертера in:

typedef reverse<s,in>::type r;

Возвращаемый тип: тип.

Семантика: эквивалентно

typedef reverse_copy<s,in>::type r;

Сложность: линейная.

Пример:

int main()

{

typedef mpl::vector_c<int,9,8,7,6,5,4,3,2,1,0> numbers;

typedef mpl::reverse< numbers >::type result;

BOOST_MPL_ASSERT(( mpl::equal< result, mpl::range_c<int,0,10> > ));

return 0;

}

Смотри также:

Transformation Algorithms, Reversible Algorithm, reverse_copy, copy, copy_if

reverse_copy

Фомрат:

template

<

typename Sequence,

typename In = unspecified

>

struct reverse_copy

{

typedef unspecified type;

};

Описание:

Возвращает реверсную копию исходной последовательности. [Эта формулировка относится к вариантам алгоритма без использования инсертера.]

Заголовок:

#include <boost/mpl/copy.hpp>

Параметры:

Выражение

Требование

Описание

Sequence

Прямая последовательность

Последовательность для копирования.

In

Инсертер (механизм вставки)

Инсертер.

Семантика выражений:

Поддерживает семантику, определенную для реверсного алгоритма, добавляет отличные/не определенные выражения.

Для любой прямой последовательности s и инсертера in:

typedef reverse_copy<s,in>::type r;

Возвращаемый тип: тип.

Семантика: эквивалентно

typedef reverse_fold< s,in::state,in::operation >::type r;

Сложность:

Линейная. Время работы прямо пропорционально значению размера

size<s>::value

Пример:

int main()

{

typedef mpl::list_c<int,10,11,12,13,14,15,16,17,18,19>::type numbers;

typedef mpl::reverse_copy<

mpl::range_c<int,0,10>,

mpl::front_inserter< numbers >

>::type result;

BOOST_MPL_ASSERT_RELATION( mpl::size<result>::value, ==, 20 );

BOOST_MPL_ASSERT(( mpl::equal< result, mpl::range_c<int,0,20>> ));

return 0;

}

Смотри также:

Transformation Algorithms, Reversible Algorithm, copy, reverse_copy_if, reverse_transform

reverse_copy_if

Фомрат:

template

<

typename Sequence,

typename Pred,

typename In = unspecified

>

struct reverse_copy_if

{

typedef unspecified type;

};

Описание:

Возвращает реверсную проверенную копию исходной последовательности. Копия содержит элементы, для которых предикат Pred вернул правду. [Эта формулировка относится к вариантам алгоритма без использования инсертера.]

Заголовок:

#include <boost/mpl/copy_if.hpp>

Параметры:

Выражение

Требование

Описание

Sequence

Прямая последовательность

Последовательность для копирования.

Pred

Унарное лямбда-выражение

Условие копирования.

In

Инсертер (механизм вставки)

Инсертер.

Семантика выражений:

Поддерживает семантику, определенную для реверсного алгоритма, добавляет отличные/не определенные выражения.

Для любой прямой последовательности s, унарного лямбда-выражения pred и инсертера in:

typedef reverse_copy_if<s,pred,in>::type r;

Возвращаемый тип: тип.

Семантика: эквивалентно

typedef lambda<pred>::type p;

typedef lambda<in::operation>::type op;

typedef reverse_fold<

s,

in::state,

eval_if<

apply_wrap1<p, _2>,

apply_wrap2<op, _1, _2>,

identity<_1>

>

>::type r;

Сложность:

Линейная. Время работы прямо пропорционально значению размера

size<s>::value

Пример:

int main()

{

typedef mpl::reverse_copy_if<

mpl::range_c<int,0,10>,

mpl::less<

mpl::_1,

mpl::int_<5>

>,

mpl::front_inserter< mpl::vector<> >

>::type result;

BOOST_MPL_ASSERT_RELATION( mpl::size<result>::value, ==, 5 );

BOOST_MPL_ASSERT(( mpl::equal<result, mpl::range_c<int,0, 5>> ));

return 0;

}

Смотри также:

Transformation Algorithms, Reversible Algorithm, copy_if, reverse_copy, remove_if, replace_if

reverse_transform

Фомрат:

template

<

typename Seq,

typename Op,

typename In = unspecified

>

struct reverse_transform

{

typedef unspecified type;

};

template

<

typename Seq1,

typename Seq2,

typename BinaryOp,

typename In = unspecified

>

struct reverse_transform

{

typedef unspecified type;

};

Описание:

Алгоритм reverse_transform имеет несколько перегруженных версий:

  • reverse_transform<Seq,Op>: возвращает преобразованную реверсную копию исходной последовательности, полученную посредством применения унарного преобразования Op к каждому элементу в диапазоне

[begin<Sequence>::type, end<Sequence>::type)

  • reverse_transform<Seq1,Seq2,Op>: возвращает новую последовательность в реверсном порядке, полученную путем применения бинарного преобразования BinaryOp для пары элементов (e1, e21) из соответствующих диапазонов

[begin<Seq1>::type, end<Seq1>::type)

и

[begin<Seq2>::type, end<Seq2>::type)

[Эта формулировка относится к алгоритмам, не использующим инсертер.]

Заголовок:

#include <boost/mpl/transform.hpp>

Модель:

  • Реверсный алгоритм.

Параметры:

Выражение

Требование

Описание

Sequence, Seq1, Seq2

Прямая последовательность

Последовательности для преобразования.

Op, BinaryOp

Лямбда-выражение

Преобразование.

In

Инсертер (механизм вставки)

Инсертер.

Семантика выражений:

Поддерживает семантику, определенную для реверсного алгоритма, добавляет отличные/не определенные выражения.

Для любых прямых последовательностей s, s1 и s2, лямбда выражения op и op2, инсертера in:

typedef transform<s,op,in>::type r;

Возвращаемый тип: тип.

Семантика: эквивалентно

typedef lambda<op>::type f;

typedef lambda<in::operation>::type in_op;

typedef reverse_fold<

s,

in::state,

bind<

in_op,

_1,

bind<f, _2>

>

>::type r;

2:

typedef transform<s1,s2,op,in>::type r;

Возвращаемый тип: тип.

Постусловие: эквивалентно

typedef lambda<op2>::type f;

typedef lambda<in::operation>::type in_op;

typedef reverse_fold<

pair_view<s1,s2>,

in::state,

bind<

in_op,

_1,

bind<

f,

bind<first<>, _2>,

bind<second<>,_2>

>

>

>::type r;

Сложность:

Линейная. Колиество применений op/op2 пропорционально значениям размера

size<s>::value

size<s1>::value

Пример:

int main()

{

typedef mpl::vector<char,short,int,long,float,double> types;

typedef mpl::vector<double*,float*,long*,int*,short*,char*> pointers;

typedef mpl::reverse_transform<types, boost::add_pointer<_1> >::type result;

BOOST_MPL_ASSERT(( mpl::equal<result, pointers> ));

return 0;

}

Смотри также:

Transformation Algorithms, Reversible Algorithm, reverse_transform, copy, replace_if

reverse_replace

Фомрат:

template

<

typename Sequence,

typename OldType,

typename NewType,

typename In = unspecified

>

struct reverse_replace

{

typedef unspecified type;

};

Описание:

Возвращает реверсную копию исходной последовательности, в который каждый тип OldType заменяется типом NewType. [Эта формулировка относится к вариантам алгоритма без использования инсертера.]

Заголовок:

#include <boost/mpl/replace.hpp>

Модель:

  • Реверсный алгоритм.

Параметры:

Выражение

Требование

Описание

Sequence

Прямая последовательность

Исходная последовательность.

OldType

Любой тип

Тип, который заменяется новым типом.

NewType

Любой тип

Тип, который меняет старый тип.

In

Инсертер (механизм вставки)

Инсертер.

Семантика выражений:

Поддерживает семантику, определенную для реверсного алгоритма, добавляет отличные/не определенные выражения.

Для любой прямой последовательности s, инсертера in, произвольных типов x и y:

typedef reverse_replace<s,x,y,in>::type r;

Возвращаемый тип: тип.

Семантика: эквивалентно

typedef reverse_replace_if< s,y,is_same<_,x>,in >::type r;

Сложность:

Линейная. Количество сравнений на идентчиность/вставку пропорционально значению размера

size<s>::value

Пример:

int main()

{

typedef mpl::vector<int,float,char,float,float,double> types;

typedef mpl::vector<double,double,double,char,double,int> expected;

typedef mpl::reverse_replace< types,float,double >::type result;

BOOST_MPL_ASSERT(( mpl::equal< result, expected > ));

return 0;

}

Смотри также:

Transformation Algorithms, Reversible Algorithm, reverse_replace, replace_if, remove, transform

reverse_replace_if

Фомрат:

template

<

typename Sequence,

typename Pred,

typename In = unspecified

>

struct reverse_replace_if

{

typedef unspecified type;

};

Описание:

Возвращает реверсную копию исходной последовательности, в который каждый тип, для которого предикат Pred возвращает правду, заменяется типом NewType. [Эта формулировка относится к вариантам алгоритма без использования инсертера.]

Заголовок:

#include <boost/mpl/replace_if.hpp>

Модель:

  • Реверсный алгоритм.

Параметры:

Выражение

Требование

Описание

Sequence

Прямая последовательность

Исходная последовательность.

Pred

Унарное лямбда-выражение

Условие замены.

NewType

Любой тип

Тип, который меняет старый тип.

In

Инсертер (механизм вставки)

Инсертер.

Семантика выражений:

Поддерживает семантику, определенную для реверсного алгоритма, добавляет отличные/не определенные выражения.

Для любой прямой последовательности s, унарного лямбда-выражения pred, инсертера in, произвольного типа x:

typedef reverse_replace_if<s,pred,x,in>::type r;

Возвращаемый тип: тип.

Семантика: эквивалентно

typedef lambda<pred>::type p;

typedef reverse_transform< s, if_< apply_wrap1<p,_1>,x,_1>, in >::type r;

Сложность:

Линейная. Количество применений pred пропорционально значению размера

size<s>::value

количество вставок, не превышает значение размера.

Пример:

int main()

{

typedef mpl::vector_c<int,1,4,5,2,7,5,3,5> numbers;

typedef mpl::vector_c<int,1,4,0,2,0,0,3,0> expected;

typedef mpl:: reverse_replace_if<

numbers,

mpl::greater<

mpl::_, // поочередно подставляются все элементы

mpl::int_<4> // если больше 4 == правда

>,

mpl::int_<0>, // если greater == правда, меняет значение на 0

mpl::front_inserter< mpl::vector<> >

>::type result;

BOOST_MPL_ASSERT

((

mpl::equal<

result,

expected,

mpl::equal_to<mpl::_, mpl::_> // сравнивает каждый с каждым

>

));

return 0;

}

Смотри также:

Transformation Algorithms, Reversible Algorithm, reverse_replace_if, replace, remove_if, transform

reverse_remove

Фомрат:

template

<

typename Sequence,

typename T,

typename In = unspecified

>

struct reverse_remove

{

typedef unspecified type;

};

Описание:

Возвращает новую последовательность, состоящую из всех элементов диапазона

[begin<Sequence>::type, end<Sequence>::type)

за исключением элементов, идентичных типу T в реверсном порядке.

[Эта формулировка относится к вариантам алгоритма без использования инсертера.]

Заголовок:

#include <boost/mpl/remove.hpp>

Модель:

  • Реверсный алгоритм.

Параметры:

Выражение

Требование

Описание

Sequence

Прямая последовательность

Исходная последовательность.

T

Любой тип

Тип, который заменяется новым типом.

In

Инсертер (механизм вставки)

Инсертер.

Семантика выражений:

Поддерживает семантику, определенную для реверсного алгоритма, добавляет отличные/не определенные выражения.

Для любой прямой последовательности s, инсертера in, произвольного типа x:

typedef reverse_remove<s,x,in>::type r;

Возвращаемый тип: тип.

Семантика: эквивалентно

typedef reverse_remove_if< s,is_same<_,x>,in >::type r;

Сложность:

Линейная. Количество сравнений на идентчиность/вставку пропорционально значению размера

size<s>::value

Пример:

int main()

{

typedef mpl::vector<int,float,char,float,float,double>::type types;

typedef mpl:: reverse_remove< types,float >::type result;

BOOST_MPL_ASSERT(( mpl::equal< result, mpl::vector< double,char,int>> ));

return 0;

}

Смотри также:

Transformation Algorithms, Reversible Algorithm, reverse_remove, remove_if, copy, replace

reverse_remove_if

Фомрат:

template

<

typename Sequence,

typename Pred,

typename In = unspecified

>

struct reverse_remove_if

{

typedef unspecified type;

};

Описание:

Возвращает новую последовательность в реверсном порядке, состоящую из всех элементов диапазона

[begin<Sequence>::type, end<Sequence>::type)

за исключением элементов, для которых предикат Pred возвращает правду.

[Эта формулировка относится к вариантам алгоритма без использования инсертера.]

Заголовок:

#include <boost/mpl/remove_if.hpp>

Модель:

  • Реверсный алгоритм.

Параметры:

Выражение

Требование

Описание

Sequence

Прямая последовательность

Исходная последовательность.

Pred

Унарное лямбда-выражение

Условие замены.

In

Инсертер

Инсертер.

Семантика выражений:

Поддерживает семантику, определенную для реверсного алгоритма, добавляет отличные/не определенные выражения.

Для любой прямой последовательности s, инсертера in, унарного лямбда-выражения pred:

typedef reverse_remove_if<s,pred,in>::type r;

Возвращаемый тип: тип.

Семантика: эквивалентно

typedef lambda<pred>::type p;

typedef lambda<in::operation>::type op;

typedef reverse_fold<

s,

in::state,

eval_if<

apply_wrap1<p,_2>,

identity<_1>,

apply_wrap2<op,_1,_2>

>

>::type r;

Сложность:

Линейная. Количество применений pred пропорционально значению размера

size<s>::value

количество вставок, не превышает значение размера.

Пример:

int main()

{

typedef mpl::vector_c<int,1,4,5,2,7,5,3,5>::type numbers;

typedef mpl:: reverse_remove_if<

numbers,

mpl::greater<

mpl::_,

mpl::int_<4>

>

>::type result;

BOOST_MPL_ASSERT

((

mpl::equal<

result,

mpl::vector_c<int, 3,2,4,1>,

mpl::equal_to<mpl::_,mpl::_>

>

));

return 0;

}

Смотри также:

Transformation Algorithms, Reversible Algorithm, reverse_remove_if, remove, copy_if, replace_if

reverse_unique

Фомрат:

template

<

typename Seq,

typename Pred,

typename In = unspecified

>

struct reverse_unique

{

typedef unspecified type;

};

Описание:

Возвращает новую последовательность в реверсном порядке, в которой каждый тип элемента является уникальным, все дубликаты удалены.

[Эта формулировка относится к вариантам алгоритма без использования инсертера.]

Заголовок:

#include <boost/mpl/unique.hpp>

Модель:

  • Реверсный алгоритм.

Параметры:

Выражение

Требование

Описание

Sequence

Прямая последовательность

Исходная последовательность.

Pred

Бинарное лямбда-выражение

Отношение эквивалентности.

In

Инсертер (механизм вставки)

Инсертер.

Семантика выражений:

Поддерживает семантику, определенную для реверсного алгоритма, добавляет отличные/не определенные выражения.

Для любой прямой последовательности s, бинарного лямбда-выражения pred, инсертера in:

typedef reverse_unique<s,pred,in>::type r;

Возвращаемый тип: тип.

Семантика: если

size<s>::value <= 1

то, эквивалентно:

typedef reverse_copy<s,in>::type r;

иначе, эквивалентно:

typedef lambda<pred>::type p;

typedef lambda<in::operation>::type in_op;

typedef apply_wrap2<

in_op,

in::state,

front<types>::type

>::type in_state;

typedef reverse_fold<

s,

pair< in_state, front<s>::type >,

eval_if<

apply_wrap2<p, second<_1>, _2>,

identity< first<_1>

>,

apply_wrap2<in_op, first<_1>, _2>

>

>::type::first r;

Сложность:

Линейная. Количество сравнений на идентчиность/вставку пропорционально значению размера

size<s>::value - 1

Пример:

int main()

{

typedef mpl::vector<int,float,float,char,int,int,int,double> types;

typedef mpl::vector< double,int,char,float,int> expected;

typedef mpl:: reverse_unique< types, boost::is_same<mpl::_1, mpl::_2> >::type result;

BOOST_MPL_ASSERT(( mpl::equal< result, expected > ));

return 0;

}

Смотри также:

Transformation Algorithms, Reversible Algorithm, reverse_unique, remove, copy_if, replace_if

reverse_partition

Фомрат:

template

<

typename Seq,

typename Pred,

typename In1 = unspecified,

typename In2 = unspecified

>

struct reverse_partition

{

typedef unspecified type;

};

Описание:

Возвращает пару последовательностей, которые вместе содержат все элементы в диапазоне

[begin<Seq>::type, end<Seq>::type)

разделенные на две группы, в соответствии с предикатом Pred. reverse_partition – синоним reverse_stable_partition.

[Эта формулировка относится к вариантам алгоритма без использования инсертера.]

Заголовок:

#include <boost/mpl/partition.hpp>

Модель:

  • Реверсный алгоритм.

Параметры:

Выражение

Требование

Описание

Seq

Прямая последовательность

Исходная последовательность.

Pred

Унарное лямбда-выражение

Предикат разделения.

In1, In2

Инсертер (механизм вставки)

Инсертеры вывода.

Семантика выражений:

Поддерживает семантику, определенную для реверсного алгоритма, добавляет отличные/не определенные выражения.

Для любой прямой последовательности s, унарного лямбда-выражения pred, инсертеров in1, in2:

typedef reverse_partition<s,pred,in1,in2>::type r;

Возвращаемый тип: пара.

Семантика: эквивалентно

typedef reverse_stable_partition<s,pred,in1,in2>::type r;

Сложность:

Линейная. Количество применений предиката pred и суммарных обращений к in1::operation / in2::operation пропорционально значению размера

size<s>::value

Пример:

template< typename N >

struct is_odd

: mpl::bool_<(N::value % 2)>

{};

int main()

{

typedef mpl::reverse_partition<

mpl::range_c<int,0,10>,

is_odd<mpl::_1>,

mpl::back_inserter< mpl::vector<> >,

mpl::back_inserter< mpl::vector<> >

>::type r;

BOOST_MPL_ASSERT(( mpl::equal< r::first, mpl::vector_c<int,9,7,5,3,1>> ));

BOOST_MPL_ASSERT(( mpl::equal< r::second, mpl::vector_c<int,8,6,4,2,0>> ));

return 0;

}

Смотри также:

Transformation Algorithms, Reversible Algorithm, reverse_partition, stable_partition, sort

reverse_stable_partition

Фомрат:

template

<

typename Seq,

typename Pred,

typename In1 = unspecified,

typename In2 = unspecified

>

struct reverse_stable_partition

{

typedef unspecified type;

};

Описание:

Возвращает пару последовательностей, которые вместе содержат все элементы в диапазоне

[begin<Seq>::type, end<Seq>::type)

разделенные на две группы, в соответствии с предикатом Pred. stable_partition гарантирует сохранение реверсной относительной упорядоченности в результирующей последовательности.

[Эта формулировка относится к вариантам алгоритма без использования инсертера.]

Заголовок:

#include <boost/mpl/stable_partition.hpp>

Модель:

  • Реверсный алгоритм.

Параметры:

Выражение

Требование

Описание

Seq

Прямая последовательность

Исходная последовательность.

Pred

Унарное лямбда-выражение

Предикат разделения.

In1, In2

Инсертер (механизм вставки)

Инсертеры вывода.

Семантика выражений:

Поддерживает семантику, определенную для реверсного алгоритма, добавляет отличные/не определенные выражения.

Для любой прямой последовательности s, унарного лямбда-выражения pred, инсертеров in1, in2:

typedef reverse_stable_partition<s,pred,in1,in2>::type r;

Возвращаемый тип: пара.

Семантика: эквивалентно

typedef lambda<pred>::type p;

typedef lambda<in1::operation>::type in1_op;

typedef lambda<in2::operation>::type in2_op;

typedef reverse_fold<

s,

pair< in1::state, in2::state >,

if_<

apply_wrap1<p,_2>,

pair<

apply_wrap2<

in1_op,

first<_1>,

_2>,

second<_1>

>,

pair<

first<_1>,

apply_wrap2<

in2_op,

second<_1>,

_2

>

>

>

>::type r;

Сложность:

Линейная. Количество применений предиката pred и суммарных обращений к in1::operation / in2::operation пропорционально значению размера

size<s>::value

Пример:

template< typename N >

struct is_odd

: mpl::bool_<(N::value % 2)>

{};

int main()

{

typedef mpl:: reverse_stable_partition<

mpl::range_c<int,0,10>,

is_odd<mpl::_1>,

mpl::back_inserter< mpl::vector<> >,

mpl::back_inserter< mpl::vector<> >

>::type r;

BOOST_MPL_ASSERT(( mpl::equal< r::first, mpl::vector_c<int, 9,7,5,3,1> > ));

BOOST_MPL_ASSERT(( mpl::equal< r::second, mpl::vector_c<int, 8,6,4,2,0> > ));

return 0;

}

Смотри также:

Transformation Algorithms, Reversible Algorithm, reverse_stable_partition, partition, sort, transform

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