Руководство по стандартной библиотеке шаблонов (STL) - страница 3

Шрифт
Интервал

стр.

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

Основные компоненты

Этот раздел содержит некоторые основные шаблонные функции и классы, которые используются в остальной части библиотеки.

Операторы (Operators)

Чтобы избежать избыточных определений operator!= из operator== и operator›, ‹=, ›= из operator‹, библиотека обеспечивает следующее:

>template ‹class Tl, class T2›

>inline bool operator!=(const T1& x, const T2& y) {

> return !(x == y);

>}


>template ‹class Tl, class T2›

>inline bool operator›(const T1& x, const T2& y) {

> return y ‹ x;

>}


>template ‹class Tl, class T2›

>inline bool operator‹=(const T1& x, const T2& y) {

> return !(y ‹ x);

>}


>template ‹class Tl, class T2›

>inline bool operator›=(const T1& x, const T2& y) {

> return !(x ‹ y);

>}

Пара (Pair)

Библиотека включает шаблоны для разнородных пар значений.

>template ‹class T1, class T2›

>struct pair {

> T1 first;

> T2 second;

> pair() {}

> pair(const T1& x, const T2& y): first(x), second(y) {}

>};


>template ‹class T1, class T2›

>inline bool operator==(const pair‹Tl,T2›& x, const pair‹Tl,T2›& y) {

> return x.first == y.first && x.second == y.second;

>}


>template ‹class T1, class T2›

>inline bool operator‹(const pair‹Tl,T2›& x, const pair‹Tl,T2›& y) {

> return x.first ‹ y.first || (!(y.first ‹ x.first) && x.second ‹ y.second);

>}

Библиотека обеспечивает соответствующую шаблонную функцию make_pair, чтобы упростить конструкцию пар. Вместо выражения, например:

>return pair‹int, double›(5, 3.1415926); // явные типы,

можно написать

>return make_pair(5, 3.1415926); // типы выводятся.


>template ‹class Tl, class T2›

>inline pair‹Tl,T2› make_pair(const T1& x, const T2& y) {

> return pair‹Tl,T2›(x, y);

>}

Итераторы

Итераторы - это обобщение указателей, которые позволяют программисту работать с различными структурами данных (контейнерами) единообразным способом. Чтобы создать шаблонные алгоритмы, которые правильно и эффективно работают с различными типами структур данных, нам нужно формализовать не только интерфейсы, но также семантику и предположения сложности итераторов. Итераторы - это объекты, которые имеют operator*, возвращающий значение некоторого класса или встроенного типа T, называемого значимым типом (value type) итератора. Для каждого типа итератора X, для которого определено равенство, имеется соответствующий знаковый целочисленный тип, называемый типом расстояния (distanсe type) итератора.

Так как итераторы - обобщение указателей, их семантика - обобщение семантики указателей в C++. Это гарантирует, что каждая шаблонная функция, которая использует итераторы, работает с обычными указателями. Есть пять категорий итераторов в зависимости от операций, определённых для них: ввода (input iterators), вывода (output iterators), последовательные (forward iterators), двунаправленные (bidirectional iterators) и произвольного доступа (random access iterators.) Последовательные итераторы удовлетворяют всем требованиям итераторов ввода и вывода и могут использоваться всякий раз, когда определяется тот или другой вид. Двунаправленные итераторы удовлетворяют всем требованиям последовательных итераторов и могут использоваться всякий раз, когда определяется последовательный итератор. Итераторы произвольного доступа удовлетворяют всем требованиям двунаправленных итераторов и могут использоваться всякий раз, когда определяется двунаправленный итератор. Имеется дополнительный атрибут, который могли быть иметь последовательные, двунаправленные и произвольного доступа итераторы, то есть они могут быть модифицируемые (mutable) или постоянные (constant) в зависимости от того, ведёт ли себя результат operator* как ссылка или как ссылка на константу. Постоянные итераторы не удовлетворяют требованиям итераторов вывода.

Таблица 1. Отношения среди категорий итераторов

Произвольного доступа -› Двунаправленные -› Последовательные -->

стр.

Похожие книги