Программирование >>  Операторы преобразования типа 

1 ... 8 9 10 [ 11 ] 12 13 14 ... 239



Вспомогательные средства

в этой главе описаны вспомогательные средства стандартной библиотеки С++:

О простые компактные классы и функции для решения распространенных задач;

О типы общего назначения; О важные функции С; О числовые пределы.

Многие (хотя и не все) из этих средств описаны в секции 20 стандарта С++, посвященной основным утилитам, а их определения находятся в заголовочном файле <utility>. Остальные рассматриваются при описании какого-либо из более сложных компонентов библиотеки либо потому, что рассчитаны в основном на работу с этим компонентом, либо по чисто историческим причинам. Например, некоторые вспомогательные функции общего назначения определяются в заголовочном файле <algorithm>, хотя оии не являются алгоритмами в интерпретации STL (эта тема рассматривается в главе 5).

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

Пары

Тип pair позволяет работать с двумя величинами как с единым целым. Он неоднократно встречается в стандартной библиотеке С++. В частности, классы контейнеров тар и multimap используют тип pair при выполнении операции с элементами, которые представляют собой пары ключ/значение (см. с. 210). Другой распространенный пример - функция, возвращающая два значения.

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



Обратите внимание: тин объявляется с ключевым словом struct вместо class, а все его члены объявляются открытыми. Следовательно, для любой нары значений возможны прямые обращения к отдельным компонентам.

Конструктор но умолчанию создает пару значений, инициализируемых конструкторами но умолчанию соответствующих типов. Согласно правилам языка, явный вызов конструктора по умолчанию также инициализирует базовые тины

Структура pair определяется d заголовочном файле <utility> следующим образом:

namespace std {

template <class Tl, class T2> struct pair {

Имена типов компонентов

typedef Tl fIrstType;

typedef T2 secondType:

Компоненты Tl first; T2 second:

/* Конструктор no умолчанию - вызовы Т1() и Т2() * обеспечивают инициализацию базовых типов */

ра1г()

: f1rst(Tl()). second(T2()) ( }

Конструктор с двумя значениями pa1r(const Т1& а, const Т2& b) : firstCa). second(b) {

Копирующий конструктор с автоматическими преобразованиями template<class U. class V> pa1r(const pair<U. V> &p) : f1rst(p.first). second(p.second) {

Сравнения

template <class Tl, class T2>

bool operator== (const pair<Tl.T2>&. const pa1r<Tl.T2>&); template <class Tl. class T2>

bool operator< (const pair<Tl.T2>&. const pair<Tl.T2>&): ... И Т.Д для !=. <=. >. >=

template <class Tl. class T2> pair<Tl. T2> make pair(const T1&, const T2&):



данных (такие, как int), поэтому следуюцее объявление инициализирует компоненты р конструкторами int() и float(), что приводит к обнулению обеих переменных:

std;:pair<int.float> р; р.first и р.second инициализируются нулями

Инициализация базовых типов вызовом конструктора по умолчанию описана на с. 30.

Шаблонная версия конструктора используется в ситуациях, требующих автоматического преобразования типов. При копировании объекта типа pair вызывается стандартный копирующий конструктор, сгенерированный по обычным правилам. Пример:

void f(std::pa1r<1nt.const char*>);

void g(std::pair<const int.std::String>):

void foo {

std::pair<int.const char*> p(42, hello ):

f(p): OK: вызывается стандартный копирующий конструктор

g(p): OK: вызывается шаблонный конструктор

Парные сравнения

Для сравнения двух пар в стандартную библиотеку С++ включены обычные операторы сравнения. Две пары считаются равными при совпадении отдельных компонентов:

namespace std {

template <class Tl, class T2>

bool operator== (const pair<Tl,T2>& x. const pair<TlJ2>& y) ( return X.first == y.first && x.second == y.second:

При сравнении пар первый компонент обладает более высоким приоритетом. Если первые компоненты пар различны, то результат их сравнения (больше или меньше) определяет результат сравнения для пар в целом. Если первые компоненты равны, то результат сравнения пар определяется сравнением вторых компонентов:

namespace std {

template <class Tl. class T2>

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):

Остальные операторы сравнения определяются аналогично.

Шабломпып конструктор не замещает стандартный копирующий конструктор. Дополнительная информация по этому вопросу приведена на с. 29.



1 ... 8 9 10 [ 11 ] 12 13 14 ... 239

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика