Анимация
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

Создание объекта и генерирование исключения throw MyProblemC-..):

В другом варианте предоставления функции what() класс исключения объявляется производным от класса, имеющего конструктор со строковым аргументом для функции w/hat():

namespace MyLib {

/* Пользовательский класс исключения

* объявлен производным от стандартного класса

* с конструктором для аргумента whatO */

class MyRangeProblem : public std::out of range { public:

MyRangeProblem (const strings whatString) : out of rangG(whatStrlng) {

void fC) {

Создание объекта конструктором со строковым аргументом и генерирование исключения

throw MyRangeProblemChere 1S my special range problem"):

Примеры использования этого подхода в программе встречаются в классах stack (см. с. 422) и queue (см. с. 430).

class МуРгоЫет : public std::exception { public:

MyProblem(...) { Специальный конструктор

virtual const char* whatO const throwC) { Функция whatO }

void f() (



Распределители памяти 49

Распределители памяти

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

Сначала распределители появились в STL для решения раздражающей проблемы с различиями в типах указателей для разных моделей памяти (near, far, huge). В наше время на их основе создаются решения, способные поддерживать разные модели памяти (общая память, уборка «мусора», объектно-ориентированные базы данных) без изменения интерфейса. Впрочем, такое применение распределителей - явление относительно недавнее, и оно еще не получило широкого распространения (вероятно, в будущем ситуация изменится).

В стандартной библиотеке С++ определяется следующий распределитель по умолчанию:

namespace std {

template <class Т> class allocator:

Этот распределитель используется по умолчанию во всех тех ситуациях, когда распределитель может передаваться в качестве аргумента. Он использует стандартные средства выделения и освобождения памяти, то есть операторы new и delete, но в спецификации ничего не говорится о том, когда и как эти операторы должны вызываться. Таким образом, конкретная реализация распределителя по умолчанию может, например, организовать внутреннее кэширование выделяемой памяти.

В большинстве программ используется распределитель по умолчанию. Иногда библиотеки предоставляют специализированные распределители, которые просто передаются в виде аргументов. Необходимость в самостоятельном программировании распределителей возникает очень редко, на практике обычно достаточно распределителя по умолчанию. По этой причине мы отложим подробное описание распределителей до главы 15, где рассматриваются не только распределители, но и их интерфейсы.




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

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

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

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

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

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

Пары

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

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



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