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

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



Общие концепции

в этой главе описаны основополагающие концепции стандартной библиотеки С++, необходимые для работы со всеми ее компонентами:

О пространство имен std;

О имена и форматы заголовочных файлов;

О общие принципы обработки ошибок и исключений;

О знакомство с распределителями памяти.

Пространство имен std

При использовании модулей и/или библиотек всегда существует вероятность конфликтов имен, которые возникают из-за того, что в модулях и библиотеках один и тот же идентификатор может применяться для разных целей. Для решения этой проблемы в С++ поддерживается концепция пространств имен (см. с. 32). Пространство имен определяет область видимости идентификаторов. В отличие от классов пространства имен открыты для расширений, определяемых в любых источниках. Таким образом, в пространстве имен могут определяться компоненты, распределенные по нескольким физическим модулям. Характерным примером такого компонента является стандартная библиотека С++, поэтому вполне логично, что в ней используется пространство имен. Все идентификаторы стандартной библиотеки С++ определяются в пространстве имен с именем std.

В соответствии с концепцией пространств имен существуют три варианта использования идентификаторов из стандартной библиотеки С++.

О Непосредственное уточнение идентификатора (например, полная запись std::ostream вместо ostream). В этом варианте записи полная команда вывода может выглядеть так:

stc(::cout « std::hex « 3.4 « std;;endl;

О Использование объявления using (см. с, 33). Например, следующий фрагмент предоставляет локальную возможность пропуска префикса std:: для cout и endl:

using std::cout: using std:lendl:



Заголовочные файлы 41

В этом случае предыдущая команда записывается так;

cout « std::hex « 3.4 « endl;

О Самый простой вариант - использование директивы using (см. с. 33). После выполнения директивы using для пространства имен std все идентификаторы этого пространства доступны так, как если бы они были объявлены глобально. Например, рассмотрим следующую команду:

using namespace std;

Эта команда позволит использовать такую запись: cout « hex « 3.4 « endl:

Учтите, что в сложных программах это может привести к периодическим конфликтам имен или, что еще хуже, к непредсказуемым последствиям из-за запутанных правил перегрузки. Никогда не используйте директиву using при отсутствии полной информации о контексте (например, в заголовочных файлах, модулях или библиотеках).

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

Заголовочные файлы

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

С определением новых имен для стандартных заголовочных файлов представилась хорошая возможность стандартизировать расширения заголовочных файлов. Раньше на практике использовались разные варианты расширений (например, .h, .hpp и .hxx). Вероятно, спецификации нового стандарта в области заголовочных файлов станут для кого-то неожиданными - теперь стандартные заголовочные файлы вообще не имеют расширений. Команды включения стандартных заголовочных файлов выглядят примерно так:

finclude <1ostream> include <str1ng>

Аналогич1юе правило действует для заголовочных файлов в стандарте С. Теперь заголовочные файлы С снабжаются префиксом с вместо прежнего расширения .h:

#include <cstdl1b> было: <stdlib.h> #1nclude <cstring> было: <string.h>



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