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

Запрашиваемые алгоритмы

find

Фомрат:

template

<

typename Sequence,

typename T

>

struct find

{

typedef unspecified type;

};

Описание:

Возвращает итератор первого вхождения типа Т в последовательность.

Заголовок:

#include <boost/mpl/find.hpp>

Параметры:

Выражение

Требование

Описание

Sequence

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

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

T

Любой тип

Тип для поиска.

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

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

typedef find<s,t>::type i;

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

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

typedef find_if<s, is_same<_,t> >::type i;

Сложность:

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

size<s>::value

Пример:

int main()

{

typedef mpl::vector<char,int,unsigned,long,unsigned long> types;

typedef mpl::find<types,unsigned>::type iter;

BOOST_MPL_ASSERT((boost::is_same< mpl::deref<iter>::type, unsigned > ));

BOOST_MPL_ASSERT_RELATION( iter::pos::value, ==, 2 );

return 0;

}

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

Querying Algorithms, contains, find_if, count, lower_bound

find_if

Фомрат:

template

<

typename Sequence,

typename Pred

>

struct find_if

{

typedef unspecified type;

};

Описание:

Возвращает итератор первого вхождения типа Т в последовательность, для которого предикат Pred возвращает правду.

Заголовок:

#include <boost/mpl/find_if.hpp>

Параметры:

Выражение

Требование

Описание

Sequence

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

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

Pred

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

Условие поиска.

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

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

typedef find_if<s,pred>::type i;

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

Семантика: i – первый итератор диапазона

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

такой, что

apply< pred, deref<i>::type >::type::value == true

Если такой итератор не сщуествует, то i идентичен

end<s>::type

Сложность:

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

size<s>::value

Пример:

int main()

{

typedef mpl::vector<char,int,unsigned,long,unsigned long> types;

typedef mpl::find_if<types, boost::is_same<mpl::_1, unsigned>>::type iter;

BOOST_MPL_ASSERT(( boost::is_same< mpl::deref<iter>::type, unsigned > ));

BOOST_MPL_ASSERT_RELATION( iter::pos::value, ==, 2 );

return 0;

}

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

Querying Algorithms, find, count_if, lower_bound

contains

Фомрат:

template

<

typename Sequence,

typename T

>

struct contains

{

typedef unspecified type;

};

Описание:

Возвращает интегральную константу true, если один или более элементов в последовательности Sequence идентичен T.

Заголовок:

#include <boost/mpl/contains.hpp>

Параметры:

Выражение

Требование

Описание

Sequence

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

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

T

Любой тип

Тип для поиска.

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

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

typedef contains<s,t>::type r;

Возвращаемый тип: интегральная константа.

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

typedef not_<

is_same<

find<s,t>::type,

end<s>::type

>

>::type r;

Сложность:

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

size<s>::value

Пример:

int main()

{

typedef mpl::vector<char,int,unsigned,long,unsigned long> types;

BOOST_MPL_ASSERT_NOT(( mpl::contains<types,bool> ));

return 0;

}

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

Querying Algorithms, find, find_if, count, lower_bound

count

Фомрат:

template

<

typename Sequence,

typename T

>

struct count

{

typedef unspecified type;

};

Описание:

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

Заголовок:

#include <boost/mpl/count.hpp>

Параметры:

Выражение

Требование

Описание

Sequence

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

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

T

Любой тип

Тип подсчета.

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

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

typedef count<s,t>::type n;

Возвращаемый тип: интегральная константа.

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

typedef count_if< s,is_same<_,T> >::type n;

Сложность:

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

size<s>::value

Пример:

int main()

{

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

typedef mpl::count<types, short>::type n;

BOOST_MPL_ASSERT_RELATION( n::value, ==, 2 );

return 0;

}

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

Querying Algorithms, count_if, find, find_if, contains, lower_bound

count_if

Фомрат:

template

<

typename Sequence,

typename Pred

>

struct count_if

{

typedef unspecified type;

};

Описание:

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

Заголовок:

#include <boost/mpl/count_if.hpp>

Параметры:

Выражение

Требование

Описание

Sequence

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

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

Pred

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

Условие подсчета.

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

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

typedef count_if<s,pred>::type n;

Возвращаемый тип: интегральная константа.

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

typedef lambda<pred>::type p;

typedef fold<

s,

long_<0>,

if_<

apply_wrap1<p,_2>,

next<_1>,

_1

>

>::type n;

Сложность:

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

size<s>::value

Пример:

int main()

{

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

BOOST_MPL_ASSERT_RELATION

((mpl::count_if< types, boost::is_float<_> >::value), ==, 1 );

BOOST_MPL_ASSERT_RELATION

((mpl::count_if< types, boost::is_same<_,char> >::value), ==, 2 );

BOOST_MPL_ASSERT_RELATION

((mpl::count_if< types, boost::is_same<_,void> >::value), ==, 0 );

return 0;

}

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

Querying Algorithms, count, find, find_if, contains

lower_bound

Фомрат:

template

<

typename Sequence,

typename T,

typename Pred = less<mpl::_1, mpl::_2>

>

struct lower_bound

{

typedef unspecified type;

};

Описание:

Возвращает первую позицию в отсортированной последовательности Sequence, где T может быть вставлен без нарушения упорядочения.

Заголовок:

#include <boost/mpl/lower_bound.hpp>

Параметры:

Выражение

Требование

Описание

Sequence

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

Отсортированная последовательность, в которой осуществляется поиск.

T

Любой тип

Тип для поиска позиции.

Pred

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

Критерий поиска.

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

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

typedef lower_bound<s, x, pred>::type i;

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

Семантика: i – самый дальний итератор в диапазоне

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

такой, что для каждого итератора j в диапазоне

[begin<s>::type, i)

выполняется:

apply< pred, deref<j>::type, x >::type::value == true

Сложность:

Количество сравнений является логарифмическим: не более

log2(size<s>::value) + 1

Если s - последовательность произвольного доступа, то количество шагов через диапазон также логарифмическая, в противном случае число шагов, пропорциональное

Размер <s>:: значение.

size<s>::value

Пример:

int main()

{

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

typedef mpl::lower_bound< numbers, mpl::int_<3> >::type iter;

BOOST_MPL_ASSERT_RELATION

((

mpl::distance<mpl::begin<numbers>::type, iter>::value), ==, 2

);

BOOST_MPL_ASSERT_RELATION( mpl::deref<iter>::type::value, ==, 3 );

return 0;

}

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

Querying Algorithms, upper_bound, find, find_if, min_element

upper_bound

Фомрат:

template

<

typename Sequence,

typename T,

typename Pred = mpl::less<mpl::_1, mpl::_2>

>

struct upper_bound

{

typedef unspecified type;

};

Описание:

Возвращает последнюю позицию в отсортированной последовательности Sequence, где T может быть вставлен без нарушения упорядочения.

Заголовок:

#include <boost/mpl/upper_bound.hpp>

Параметры:

Выражение

Требование

Описание

Sequence

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

Отсортированная последовательность, в которой осуществляется поиск.

T

Любой тип

Тип для поиска позиции.

Pred

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

Критерий поиска.

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

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

typedef upper_bound< s,x,pred >::type i;

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

Семантика: i – самый дальний итератор в диапазоне

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

такой, что для каждого итератора j в диапазоне

[begin<s>::type, i)

выполняется:

apply< pred, deref<j>::type, x >::type::value == false

Сложность:

Количество сравнений является логарифмическим: не более

log2(size<s>::value) + 1

Если s - последовательность произвольного доступа, то количество шагов через диапазон также логарифмическая, в противном случае число шагов, пропорциональное

Размер <s>:: значение.

size<s>::value

Пример:

int main()

{

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

typedef mpl::upper_bound< numbers, mpl::int_<3> >::type iter;

BOOST_MPL_ASSERT_RELATION

((

mpl::distance<mpl::begin<numbers>::type, iter>::value), ==, 5

);

BOOST_MPL_ASSERT_RELATION( mpl::deref<iter>::type::value, ==, 5 );

return 0;

}

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

Querying Algorithms, lower_bound, find, find_if, min_element

min_element

Фомрат:

template

<

typename Sequence,

typename Pred = mpl::less<mpl::_1, mpl::_2>

>

struct min_element

{

typedef unspecified type;

};

Описание:

Возвращает итератор наименьшего элемента в последовательности Sequence.

Заголовок:

#include <boost/mpl/min_element.hpp>

Параметры:

Выражение

Требование

Описание

Sequence

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

Отсортированная последовательность, в которой осуществляется поиск.

Pred

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

Критерий сравнения.

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

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

typedef min_element<s,pred>::type i;

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

Семантика: i – первый итератор в диапазоне

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

такой, что для каждого итератора j в диапазоне

[begin<s>::type, i)

выполняется:

apply< pred, deref<j>::type, deref<i>::type >::type::value == false

Сложность:

Линейная. Нуль сравнений, если s – пустая последовательность, иначе количество сравнения равно:

size<s>::value - 1

Пример:

int main()

{

typedef mpl::vector<bool,char[50],long,double> types;

typedef mpl::min_element<

mpl::transform_view<

types,

mpl::sizeof_<mpl::_1>

>

>::type iter;

BOOST_MPL_ASSERT(( boost::is_same<mpl::deref<iter::base>::type, bool> ));

return 0;

}

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

Querying Algorithms, max_element, find_if, upper_bound, find

max_element

Фомрат:

template

<

typename Sequence,

typename Pred = mpl::less<mpl::_1, mpl::_2>

>

struct max_element

{

typedef unspecified type;

};

Описание:

Возвращает итератор наибольшего элемента в последовательности Sequence.

Заголовок:

#include <boost/mpl/max_element.hpp>

Параметры:

Выражение

Требование

Описание

Sequence

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

Отсортированная последовательность, в которой осуществляется поиск.

Pred

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

Критерий сравнения.

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

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

typedef max_element<s,pred>::type i;

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

Семантика: i – первый итератор в диапазоне

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

такой, что для каждого итератора j в диапазоне

[begin<s>::type, i)

выполняется:

apply< pred, deref<i>::type, deref<j>::type >::type::value == false

Сложность:

Линейная. Нуль сравнений, если s – пустая последовательность, иначе количество сравнения равно:

size<s>::value - 1

Пример:

int main()

{

typedef mpl::vector<bool,char[50],long,double> types;

typedef mpl::max_element<

mpl::transform_view<

types,

mpl::sizeof_<mpl::_1>

>

>::type iter;

BOOST_MPL_ASSERT(( boost::is_same<mpl::deref<iter::base>::type, char[50]> ));

return 0;

}

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

Querying Algorithms, min_element, find_if, upper_bound, find

equal

Фомрат:

template

<

typename Seq1,

typename Seq2,

typename Pred = boost::is_same<mpl::_1, mpl::_2>

>

struct equal

{

typedef unspecified type;

};

Описание:

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

Заголовок:

#include <boost/mpl/equal.hpp>

Параметры:

Выражение

Требование

Описание

Seq1, Seq2

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

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

Pred

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

Критерий сравнения.

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

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

typedef equal<s1,s2,pred>::type c;

Возвращаемый тип: интегральная константа.

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

c::value == true

только в том случае, если

size<s1>::value == size<s2>::value

а также, для любого итератора i в диапазоне

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

выражение

deref<i>::type

идентично:

advance< begin<s2>::type, distance< begin<s1>::type,i >::type >::type

Сложность:

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

size<s>::value

Пример:

int main()

{

typedef mpl::vector<char,int,unsigned,long,unsigned long> s1;

typedef mpl::list<char,int,unsigned,long,unsigned long> s2;

BOOST_MPL_ASSERT(( mpl::equal<s1,s2> ));

return 0;

}

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

Querying Algorithms, find, find_if

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