![]() |
![]() ![]() ![]() ![]() ![]() |
![]() |
InterfaceBoost , Chapter 1. Boost.Icl , Chapter 1. Boost.Icl
|
группа |
форма |
шаблон |
параметры |
---|---|---|---|
статически ограничен | асимметричный | | |
| |||
symmetric | closed_interval | ||
open_interval | |||
discrete_interval | |||
Не каждый шаблон класса работает со всеми типами доменов. Используйте шаблоны интервального класса согласно следующей таблице.
Table 1.7. Usability of interval class templates for discrete or continuous domain types
группа |
форма |
шаблон |
диск | непрерывно [ORIG_END] --> |
---|---|---|---|---|
статически ограничен | асимметричный | да | да | |
да | да | |||
symmetric | closed_interval | да | ||
open_interval | да | |||
discrete_interval | да | |||
да |
С прагматической точки зрения, наиболее важным шаблоном интервального класса статически ограниченной является right_open_interval
. Для отдельных типов доменов также могут быть удобными замкнутые интервалы. Асимметричные интервалы могут использоваться с непрерывными типами доменов, но continuous_interval
- единственный шаблон класса, который позволяет представлять одиночный интервал, содержащий только один элемент.
Используйте непрерывный_интервал
, если вы работаете с интервальными контейнерами созерцательных типов доменов и хотите иметь возможность обрабатывать одиночные значения:
typedef interval_set<std::string, std::less, continuous_interval<std::string> > IdentifiersT; IdentifiersT identifiers, excluded; identifiers += continuous_interval<std::string>::right_open("a", "c"); // special identifiers shall be excluded identifiers -= std::string("boost"); cout << "identifiers: " << identifiers << endl; excluded = IdentifiersT(icl::hull(identifiers)) - identifiers; cout << "excluded : " << excluded << endl; //------ Program output: -------- identifiers: {[a,boost)(boost,c)} excluded : {[boost,boost]}
interval
Как показано в приведенном выше примере, вы можете выбрать тип интервала, обобщая шаблон интервала контейнера с желаемым типом.
typedef interval_set<std::string, std::less, continuous_interval<std::string> > IdentifiersT;
Но вы можете работать с библиотекой по умолчанию для параметров интервальных шаблонов, что является interval<DomainT,Compare>::type
.
интервалы |
domain_type |
интервал_по умолчанию | |
---|---|---|---|
| статичный | ||
| динамика |
диск | discrete_interval |
непрерывно [ORIG_END] --> |
Итак, если вы всегда довольны по умолчанию библиотеки для интервального типа, просто используйте
icl::interval<MyDomainT>::type myInterval;
как стандартный способ объявления интервалов и параметров по умолчанию для интервальных контейнеров:
typedef interval_set<std::string> IdentifiersT; IdentifiersT identifiers, excluded; identifiers += interval<std::string>::right_open("a", "c"); . . .
Таким образом, шаблон класса interval
предоставляет стандартный способ работы с библиотекой по умолчанию для интервалов. Via interval<D,C>::type
можно объявить интервал по умолчанию. Кроме четырех статических функций
T interval<D,C>::right_open(const D&, const D&); T interval<D,C>::left_open(const D&, const D&); T interval<D,C>::closed(const D&, const D&); T interval<D,C>::open(const D&, const D&);
T = interval<D,C>::type
.
Если вы
#define BOOST_ICL_USE_STATIC_BOUNDED_INTERVALS
библиотека использует только статически ограниченную right_open_interval
как тип интервала по умолчанию. В этом случае четыре статических функции выше также доступны, но они только перемещают интервальные границы последовательно, если их тип домена дискретен, и создают соответствующие right_open_interval
, наконец:
interval<D,C>::right_open(a,b) == [a, b) -> [a , b ) interval<D,C>:: left_open(a,b) == (a, b] -> [a++, b++) interval<D,C>:: closed(a,b) == [a, b] -> [a , b++) interval<D,C>:: open(a,b) == (a, b) -> [a++, b )
Для непрерывных типов доменов применима только первая из четырех функций, которая соответствует стандарту библиотеки для статически ограниченных интервалов: right_open_interval
. Остальные три функции не могут выполнять соответствующую трансформацию и не будут компилироваться.
Следующие две таблицы дают обзор более шаблоны классов icl.
Table 1.8. Set class templates
группа |
шаблон |
параметры |
---|---|---|
| ||
| ||
|
Ниже подробно описываются шаблоны и параметры шаблонов, указанные в предыдущей таблице. Interval_sets
представляют три шаблона класса interval_set
, separate_interval_set
и split_interval_set
все имеют равные шаблонные параметры.
Table 1.9. Parameters of set class templates
тип элементов |
порядок элементов |
тип интервалов |
распределение памяти | |
---|---|---|---|---|
| | | | |
DomainT | Compare =
std::less | |||
DomainT | Compare =
std::less | | Alloc =
std::alloc |
Следующие две таблицы дают обзор более шаблоны классов карт icl.
Table 1.10. map class templates
группа |
шаблон |
параметры |
---|---|---|
| ||
| ||
|
Ниже подробно описываются шаблоны и параметры шаблонов, указанные в предыдущей таблице. Interval_maps
представляют два шаблона класса interval_map
и split_interval_map
, что все имеют равные параметры шаблонов.
Table 1.11. Parameters of map class templates
элементы |
отображенные значения |
черта |
порядок элементов |
агрегация |
распространение пересечения |
тип интервалов |
распределение памяти | |
---|---|---|---|---|---|---|---|---|
| | | | | | | | |
DomainT | | | Compare =
std::less | |
| | Alloc =
std::alloc | |
DomainT | | | Compare =
std::less | |
| Alloc =
std::alloc |
Используя следующие владельцы мест,
D := class DomainT, C := class CodomainT, T := class Traits, cp := template<class D>class Compare = std::less, cb := template<class C>class Combine = icl::inplace_plus, s := template<class C>class Section = icl::inplace_et, I := class IntervalT = icl::interval<D,cp>::type a := template<class>class Alloc = std::allocator
мы приходим к финальной синоптической матрице классовых шаблонов и их параметров.
interval <D, cp, > interval_sets<D, cp, I, a > interval_maps<D, C, T, cp, cb, s, I, a > icl::map <D, C, T, cp, cb, s, a >
Выбор параметров и их позиций следует за std::контейнерами как можно ближе, так что использование интервальных наборов и карт требует только минимальных дополнительных знаний.
Дополнительные знания требуются при моментализации параметра сравнения Compare
или параметра распределения Alloc
. В отличие от std::контейнеров, они должны быть мгновенными как шаблоны, например.
interval_set<string, german_compare> sections; // 2nd parameter is a template std::set<string, german_compare<string> > words; // 2nd parameter is a type
Статья Interface раздела Chapter 1. Boost.Icl Chapter 1. Boost.Icl может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.
:: Главная :: Chapter 1. Boost.Icl ::
реклама |