Анимация
JavaScript


Главная  Библионтека 

0 1 2 3 4 5 6 7 8 9 10 [ 11 ] 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239

Обратите внимание: тип объявляется с ключевым словом 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 умолчанию - вызовы ТК) и Т2() * обеспечивают инициализацию базовых типов */

ра1г()

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

Конструктор с двумя значениями pa1r(const Т1& а, const Т2& b) : flrst(a). 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> pa1r<Tl. T2> make pair(const T1&, const T2&):



данных (такие, как int), поэтому следую1цее объявление инициализирует компоненты р конструкторами 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 TI, 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 TI. 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.



вспомогательная функция make pair

Шаблонная функция make pair() позволяет создать пару значений без явного указания типов:

namespace std {

Создание обьекта пары только по значениям template <class Tl. class Т2> palr<Tl. Т2> make pa1r(const T1& x. const T2& y) { return pa1r<Tl.T2>(x. y):

Например, благодаря функции make pair следующие строки эквивалентны:

std::makej)a1r(42,) std: .palr<lnt.char>(42. (Э)

В частности, фзшкция makej3air позволяет легко передать два значения, образующие пару, функции с аргументом тина pair. Рассмотрим следующий пример:

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

void foo {

f(std;:niake pa1r(42."hello")); Два значения передаются в виде пары gCstd::niake pa1r(42."hello")): Два значения передаются в виде пары

с преобразованием типа.

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

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

std;:pa1r<1nt.float>(42.7.77) std::make pa1r(42.7.77)

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

Использование функции make pair() не требует дополнительных затрат при ньшолне-нии программы. Компилятор всегда оптимизирует подобные вызовы.



0 1 2 3 4 5 6 7 8 9 10 [ 11 ] 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239