Алгоритм sort_heap()
template< class RandomAccessIterator > void sort_heap( RandomAccessIterator first, RandomAccessIterator last ); template< class RandomAccessIterator, class Compare > void sort_heap( RandomAccessIterator first, |
RandomAccessIterator last, Compare comp );
sort_heap()
сортирует последовательность в диапазоне [first,last), предполагая, что это правильно построенный хип; в противном случае поведение программы не определено. (Разумеется, после сортировки хип перестает быть хипом!) В первом варианте при сравнении используется оператор “меньше”, определенный для типа элементов контейнера, а во втором – операция comp.
#include <algorithm> #include <vector> #include <assert.h> template <class Type> void print_elements( Type elem ) { cout << elem << " "; }
int main() { int ia[] = { 29,23,20,22,17,15,26,51,19,12,35,40 }; vector< int, allocator > vec( ia, ia+12 );
// печатается: 51 35 40 23 29 20 26 22 19 12 17 15 make_heap( &ia[0], &ia[12] ); void (*pfi)( int ) = print_elements; for_each( ia, ia+12, pfi ); cout << "\n\n"; // печатается: 12 17 15 19 23 20 26 51 22 29 35 40 // минимальный хип: в корне наименьший элемент make_heap( vec.begin(), vec.end(), greater<int>() ); for_each( vec.begin(), vec.end(), pfi ); cout << "\n\n"; // печатается: 12 15 17 19 20 22 23 26 29 35 40 51 sort_heap( ia, ia+12 ); for_each( ia, ia+12, pfi ); cout << "\n\n"; // добавим новый наименьший элемент vec.push_back( 8 ); // печатается: 8 17 12 19 23 15 26 51 22 29 35 40 20 // новый наименьший элемент должен оказаться в корне push_heap( vec.begin(), vec.end(), greater<int>() ); for_each( vec.begin(), vec.end(), pfi ); cout << "\n\n"; // печатается: 12 17 15 19 23 20 26 51 22 29 35 40 8 // наименьший элемент должен быть заменен на следующий по порядку pop_heap( vec.begin(), vec.end(), greater<int>() ); for_each( vec.begin(), vec.end(), pfi ); cout << "\n\n"; |
}
#
#include, директива
использование с using-директивой, 68, 427
использование с директивой связывания, 354
*
умножения оператор
комплексных чисел, 155
ч
члены класса
функции-члены
константные, 611–14
подвижные (volatile), 611–14
Д
деструктор(ы)
для элементов масс??а
освобождение динамической памяти, 693–94
abort(), функция
вызов из terminate() как подразумеваемое поведение, 541
abs(), функция
поддержка для комплексных чисел, 156
accumulate(), обобщенный алгоритм, 1104
adjacent_difference(), обобщенный алгоритм, 1106
adjacent_find(), обобщенный алгоритм, 1107
ainooi
к базовому классу, 880–88
algorithm, заголовочный файл, 584
any(), функция
в классе bitset, 167
append(), функция
конкатенация строк, 287
argc, переменная
счетчик аргументов в командной строке, 356
argv, массив
для доступа к аргументам в командной строке, 356
assert(), макрос, 51
использование для отладки, 226
at(), функция
контроль выхода за границы диапазона во время выполнения, 289
atoi(), функция
применение для обработки аргументов в командной строке, 360
auto_ptr, шаблон класса, 395–400
memory, заголовочный файл, 395
инициализация, 397
подводные камни, 399
aункции
интерфейс
включение объявления исключений в, 546
B
back(), функция
поддержка очереди, 316
back_inserter(), адаптор функции
использование в операции вставки push_back(), 577
begin(), функция
итератор
возврат с помощью, 578
использование, 261
binary_search(), обобщенный алгоритм, 1108
bind1st(), адаптор функции, 573
bind2nd(), адаптор функции, 573
bitset, заголовочный файл, 168
bitset, класс, 165
size(), функция, 167
test(), функция, 167
to_long(), функция, 170
to_string(), функция, 170
заголовочный файл bitset, 168
оператор доступа к биту ([]), 167
операции, 168–71
break, 218–19
break, инструкция
использование для выхода из инструкции switch, 203
сравнение с инструкцией return, 346
C
C, язык
символьные строки
динамическое выделение памяти для, 401
необходимость доступа из класса string, 128
отсутствие завершающего нуля как программная ошибка, 402
C_str(), функция
преобразование объектов класса string в C-строки, 137
C++, язык
std, пространство имен, 426–28
введение в (глава), 12–13
компоненты
(часть 2), 319
типы данных (глава), 98–140
предопределенные операторы (таблица), 727
case, ключевое слово
использование в инструкции switch (таблица), 202
catch-обработчик, 62, 534, 537
критерий выбора, 63
определение, 537
универсальный обработчик, 543–45
cerr, 26
представление стандартного вывода для ошибок с помощью, 1041
char *, указатель
работы с C-строками символов, 92
char, тип, 76
check_range(), пример функции
как закрытая функция-член, 51
cin, 26
использование итератора istream_iterator, 579
представление стандартного ввода с помощью, 1041
class, ключевое слово
typename как синоним, 479
использование в определении класса, 594
использование в определении шаблона класса, 801
использование в параметрах-типах шаблона
класса, 800
функции, 476
const, квалификатор
вопросы разрешения перегрузки функций
параметры-типы, 432
вопросы разрешения перезагрузки функций
использование преобразования квалификаторов, 449
ранжирование преобразований, связанных с инициализацией ссылочных параметров, 473
константная функция-член, 611–14
константные объекты, динамическое выделение и освобождение памяти, 402–3
константные параметры
параметры-ссылки с квалификатором const, 330, 340
передача массива из константных элементов, 336
константный итератор, 262
контейнеры, необходимость константного итератора, 575
преобразование объектов в константы, 101
сравнение с volatile, 127
ссылка, инициализация объектом другого типа, 105
указатели на константные объекты, 101
const_cast, оператор, 180
continue, инструкция, 219
copy(), обобщенный алгоритм, 1109
использование класса inserter, 305
конкатенация векторов с помощью, 557
count(), обобщенный алгоритм, 1112
использование istream_iterator и ostream_iterator, 581
использование с контейнерами multimap и multiset, 311
использование с множествами, 306
использование с отображениями, 298
count(), функция
в классе bitset, 167
count_if(), обобщенный алгоритм, 1114
cout, 26
представление стандартного вывода с помощью, 1041
cпецификации
исключений
для документирования исключений, 546
D
default, ключевое слово
использование в инструкции switch, 202, 205
delete, оператор, 35, 162–63, 744–53
безопасное и небезопасное использование, примеры, 394
для массивов, 749–51
объектов класса, 750
синтаксис, 402
для одиночного объекта, 392
использование класса-распределителя памяти (сноска), 256
размещения, 751–53
deque (двустороння очередь, дека)
использование итераторов с произвольным доступом, 583
как последовательный контейнер, 248–301
применение для реализации стека, 314
требования к вставке и доступу, 252
do-while, инструкция, 216–18
сравнение с инструкциями for и while, 209
E
иници??изация
массива
динамически выделенных объектов классов, 691–94
копиру??ий
конструктор, 680–82
end(), функция
итератор, использование, 261
endl, манипулятор потока iostream, 27
enum, ключевое слово, 112
equal_range(), обобщенный алгоритм
использование с контейнерами multimap и multiset, 310
extern "C"
и перегруженные функции, 438–39
неприменимость безопасного связывания, 440
указатели на функции, 373–75
extern, ключевое слово
использование с указателями на функции, 373
использование с членами пространства имен, 418
как директива связывания, 354
объявление
константы, 386
шаблона функции, 481
объявления объектов
без определения, 382
размещение в заголовочном файле, 384
F
f, суффикс
нотация для литерала с плавающей точкой одинарной точности, 77
find(), обобщенный алгоритм
использование с контейнерами multiset и multimap, 309
поиск объектов в множестве, 306
поиск подстроки, 273
поиск элемента отображения, 298
find_first_of(), обобщенный алгоритм
нахождение знаков препинания, 280
нахождение первого символа в строке, 273
find_last_ of(), 279
find_last_not_of(), 279
for, инструкция, 209–12
использование с инструкцией if, 196
front(), функция
поддержка очереди, 316
front_inserter(), адаптор функции
использование в операции push_front(), 577
fstream, класс
файловый ввод / вывод, 1042
full(), функция
модификация алгоритма динамического роста стека, 317
functional, заголовочный файл, 568
G
get(), функция, 1063–66
getline(), функция, 270, 1066–68
goto, инструкция, 219–22
greater, объект-функция, 571
greater_equal, объект-функция, 571
I
i?enaaeaaiea
почленное для объектов класса, 925–29
i?iecaiaiua eeannu
ae?ooaeuiua ooieoee, 899–925
определение
при одиночном наследовании, 876–78
присваивание
оператор
перегруженный, 925–29
if, инструкция, 192–98
If, инструкция
условный оператор как альтернатива, 158
insert(), функция
вставка символов в строку, 286
добавление элементов в множество, 305
реализация, 266
списки, 222
inserter(), адаптор функции
для вставки с помощью insert(), 577
inserter, класс, 305
Iomanip, заголовочный файл, 136
iostream библиотека
iostream.h, заголовочный файл, пример использования, 563
ввод
istream_iterator, 579
итератор чтения, 582
вывод
ostream_iterator, 580–82
итератор записи, 582
итератор чтения, 582
итераторы, 578–82
манипуляторы
endl, 27
операторы, сцепление, 28–29
iostream.h, заголовочный файл
пример использования для манипуляций с текстом, 563
isalpha(), функция, 206
ctype, заголовочный файл, 283
isdigit(), функция
ctype, заголовочный файл, 283
ispunct(), функция
ctype, заголовочный файл, 283
isspace(), функция
ctype, заголовочный файл, 283
istream_iterator, 579–80
iterator, заголовочный файл, 578
L
less, объект-функция, 572
less_equal, объект-функция, 572
limits, заголовочный файл, 145
list, заголовочный файл, 256
locale, заголовочный файл, 283
l-значение, 81
как возвращаемое значение, подводные камни, 348
оператор присваивания, требования, 149
преобразования, 447
преобразование точного соответствия, 445
точное соответствие при разрешении перегрузки функций, 457
трансформация, 450, 469
преобразование аргументов шаблона функции, 486
M
main(), 15
обработка аргументов в командной строке, 356–65
map, заголовочный файл, 293
использование с контейнером multimap, 309
memory, заголовочный файл, 395
merge(), обобщенный алгоритм
специализированная версия для спискаов, 588
minus(), объект-функция, 570
modulus, объект-функция, 571
multimap (мультиотображение), контейнер, 309–12
map, заголовочный файл, 310
сравнение с отображением, 303
multiplies, объект-функция, 570
multiset (мультимножество), контейнер, 309–12
set, заголовочный файл, 310
N
negate, объект-функция, 571
new оператор, 162–63
для константных объектов, 403–4
для массивов, 400–402
классов, 749–51
для объектов классов, 745
для одиночных объектов, 392–95
использование класса распределителя памяти (сноска), 256
оператор размещения new, 403–4
для объектов класса, 751–53
спецификации
исключений, 546–50
и указат??и на функции, 548–50
статические члены класса, 621–27
данные-члены, 621–27
функции-члены, 626–27
not_equal_to, объект-функция
(код), 571
not1(), адаптор функции
как адаптор-отрицатель, 573
not2(), адаптор функции
как адаптор-отрицатель, 573
numeric, заголовочный файл, 584
использование численных обобщенных алгоритмов, 586
O
oaaeiiu eeannia
конкретизация, 800–811
члены
шаблонов, 826–31
ofstream, тип, 1076–86
фун??ии-члены
volatile, 611–14
функции-члены
константные, 611–14
ostream_iterator, 580–82
P
pair, класс, 127
использование для возврата нескольких значений, 197
plus, объект-функция, 568, 570
pop_back(), функция
для удаления элементов из последовательного контейнера, 267
использование для реализации динамического роста стека, 317
push_back(), функция
векторы, вставка элементов, 123
поддержка в контейнерах, 257
стеки, использования для динамического выделения памяти, 317
push_front(), функция
поддержка в списковых контейнерах, 257
pаголовочные файлы
содержимое
объявления функций, с включением явной спецификации исключений, 546
Q
queue, заголовочный файл, 315
R
register, ключевое слово, 389–90
reinterpret_cast, оператор
опасности, 181
reinterpret_cast, оператор, 181
release()б функция
управление объектами с помощью класса auto_ptr, 400
reserve(), функция
использование для установки емкости контейнера, 255
reset(), функция
в классе bitset, 167
установка указателя auto_ptr, 398
resize(), функция
использование для изменения размера контейнера, 258
return, инструкция
завершение функции с помощью, 346
неявное преобразование типа в, 176
сравнение с выражением throw, 531
r-значение, 81
использование при вычислении выражений, 141
S
set, заголовочный файл, 304, 310
size(), функция
для модификации алгоритма выделения памяти в стеке, 317
sizeof, оператор, 159–62
использование с типом ссылки, 161
использование с типом указателя, 161
как константное выражение, 162
sort(), обобщенный алгоритм
вызов, 120
передача объекта=функции в качестве аргумента, 569
stack, заголовочный файл, 312
static_cast
сравнение с неявным преобразованием, 180
static_cast, оператор
опасности, 181
std, пространство имен, 426–28
string, заголовочный файл, 67
string, строковый тип, 95–98
substr(), функция, 275
пустая строка, 96
смешение объектов типа string и C-строк, 97
switch, инструкция, 207
использование ключевого слова case, 202
использование ключевого слова default, 202, 205
T
terminate(), функция, 541
this, указатель, 616–20
tolower(), функция
locale, заголовочный файл, 283
преобразование заглавных букв в строчные, 283
toupper(), функция
ctype, заголовочный файл, 283
locale, заголовочный файл, 283
true, ключевое слово, 108
typedef
для объявления указателя на функцию, 372
для улучшения читабельности, 295, 369
как синоним существующего имени типа, 431
массива указателей на функции, 369
typename, 242
использование с параметрами шаблона функции, 480
U
unexpected(), функция
для обработки нераспознанных исключений, 547
unique(), обобщенный алгоритм
удаление дубликатов из вектора, 557
unique_copy(), обобщенный алгоритм
запись целых чисел из вектора в стандартный вывод, 579
using-директивы, 423–26
влияние на разрешение перегрузки функции, 463
для объявления перегруженных функций, 437–38
сравнение с using-объявлениями, 423–26
using-объявления, 422–23
влияние на разрешение перегрузки функции, 462
для объявления перегруженных функций, 434–36
сравнение с using-директивами, 423–26
utility, заголовочный файл, 127
V
vector, заголовочный файл, 70, 121, 256
void
в списке параметров функции, 325
указатель, 179
void*
преобразование в void* как стандартное преобразование, 456
volatile, квалификатор, 127
для типа параметра, в связи с перегрузкой функций, 432
для функции-члена, 611–14
использование преобразования квалификаторов, 471
преобразование
квалификаторов, 449
W
while, инструкция, 213–16
сравнение с инструкциями for и do-while, 209
А
абстракция
объекта, класс комплексных чисел как пример, 154
стандартная библиотека, преимущества использования, 165
автоматические объекты, 388–90
объявление с ключевым словом register, 389–90
особенности хранения, 388
адапторы
функций, для объектов-функций, 573
адапторы функций, 573
адрес(а)
как значение указателя, 88
конкретизированных шаблонов функций, 484
алгоритм(ы)
функция
выведение аргумента шаблона, 489
разрешение перегрузки, 511
шаблон как, 475
аргумент(ы), 321
передача, 345
использование указателей для, 87
передача по значению, 327
по умолчанию, 340–43
должны быть хвостовыми, 341
и виртуальные функции, 913
и устоявшие функции, 472–73
тип
преобразования, разрешение перегрузки функции, 444–60
преобразования, расширение типа, 451–53
преобразования, ссылок, 457–59
преобразования, стандартные, 453–57
шаблона класса
для параметров-констант, 805–9
для параметров-типов, 800–811
шаблонов функции
явные, 490–93
шаблонов функций
выведение аргументов, 485–90
явная спецификация, мотивировка, 492
явная спецификация, недостатки, 492
явное специфицирование, 490
арифметические
исключения, 143
объекты-функции, 570
операторы, 142–45
таблица, 142
операции, поддержка для комплексных чисел, 126
преобразования, 175, 142–45
bool в int, 109
неявное выполнение при вычислении выражений, 175
типов, расширение типа перечисления, 112
указатели, 90
ассоциативность
операторов, влияние на вычисление выражений, 171–74
порядок вычисления подвыражений, 142
ассоциативные контейнеры, 248–301
неприменимость обобщенных алгоритмов переупорядочения, 587
ассоциирование
значений, использование класса pair, 127
Б
базовые классы
абстрактные базовые классы, 865–69, 908
видимость классов
при виртуальном наследовании, 983–84
видимость членов
при множественном наследовании, 968–71
при одиночном наследовании, 966–68
виртуальные базовые классы, 974–87
деструкторы, 896–99
доступ
к базовым классам, 958–64
к закрытым базовым классам, 963
к защищенным членам, 871
к членам, 880–88
доступ к элементам отображения с помощью, 299
конструирование
виртуальное наследование, 974–82
множественное наследование, 950–51
одиночное наследование, 889–96
почленная инициализация, 925–27
конструкторы, 889–99
определение базового класса
при виртуальном наследовании, 976–78
при множественном наследовании, 950–55
при одиночном наследовании, 871–75
преобразование к базовому классу, 865–69
при выведении аргументов шаблона функции, 487
присваивание, почленное присваивание, 927–29
байты
запись с помощью put(), 1063
чтение с помощью get(), 1063–66
безопасное связывание, 384
перегруженных функций, 440
бесконечный
рекурсия, 351
цикл, избежание в операциях поиска в строке, 274
бинарные
операторы, 141
битовое поле
как средство экономии памяти, 643–45
битовый вектор, 164
в сравнении с классом bitset, 164
блок
try-блок, 533–37
инструкций, 188
комментария, 24
функции, 321
функциональный try-блок, 533–37
и конструкторы, 1024–26
больше (>), оператор
поддержка в арифметических типах данных, 30
булевский(е)
константы, операторы, дающие в результате, 146
стандартные преобразования при разрешении перегрузки функции, 453
тип bool, 108–10
В
вектор(ы)
find(), обобщенный алгоритм, 554
емкость, связь с размером, 258
идиоматическое употребление в STL, 123
объектов класса, 689–96
присваивание, сравнение со встроенными массивами, 122
сравнение со списками, 251–52
требования к вставке и доступу, 252
увеличение размера, 253–56
вертикальная табуляция ()
как escape-последовательность, 77
взятия адреса (&) оператор
использование в определении ссылки, 104, 105
использование с именем функции, 367
как унарный оператор, 141
взятия индекса оператор ([]), 736
использование в векторах, 121
использование в классе bitset, 168
использование в отображениях, 294
отсутствие поддержки в контейнерах multimap и multiset, 312
взятия остатка, оператор (%), 142
видимость
определения символической константы, 386
переменных в условии цикла, 211, 379–81
роль в выборе функции-кандидата при разрешении перегрузки функции, 460
требование к встроенным функциям, 353, 387
членов класса, 607, 645–52
висячий
проблемы висячего else, описание и устранение, 195
указатель, 389
как проблема динамически выделенного объекта, 394
возврат каретки (\\r)
как escape-последовательность, 77
время жизни, 381
auto_ptr, влияние на динамически выделенные объекты, 395
автоматических объектов, 388
динамически выделенных объектов, 392
сравнение с указателями на них, 394
и область видимости (глава), 376–428
локальных объектов
автоматических и статических, 388
влияние раскрутки стека на объекты типа класса, 541
проблема возврата ссылки на локальный объект, 348
вставка элементов
в вектор, 123
в контейнер, с помощью адапторов функций, 577
в контейнеры multimap и multiset, 311
в отображение, 294
в последовательные контейнеры, 265
в стек, 314
использование push_back(), 257
итераторы, обозначение диапазона, 575–77
различные механизмы для разных типов контейнеров, 252
встроенные функции, 133, 322
объекты-функции, 559, 566
объявление, 352–53
шаблонов функций как, 481
определение, размещение в заголовочном файле, 385
перегруженные операторы вызова, 559
преимущества, 352
сравнение с не-встроенными функциями-членами, 605–7
встроенный(е)
массивы
запрет иниициализации другим массивом, 115
запрет использования в качестве возвращаемого значения функции, 324
запрет присваивания другому массиву, 324
запрет ссылаться на, 115
инициализация при выделении из хипа, 400
отсутствие поддержки операции erase(), 557
поддержка в обобщенных алгоритмах, 553
сравнение с векторами, 122
типы данных
арифметические, 30–33
выполнение
непоследовательные инструкции, 20
условное, 20
выражения
(глава), 141–87
использование аргументов по умолчанию, 342
порядок вычисления подвыражений, 142
разрешение имен, 377
вычисление
логических операторов, 146
порядок вычисления подвыражений, 142
вычитание
minus, объект-функция, 570
комплексных чисел, 154
Г
глобальное пространство имен
проблема засорения, 66, 406
глобальные объекты
и функции, 381–87
сравнение с параметрами и возвращаемыми значениями функций, 349–50
глобальные функции, 381
горизонтальная табуляция (\\t)
как escape-последовательность, 77
Д
данные члены, 595–96
данные-члены
битовые поля, 643–45
изменчивые (mutable), 614–16
статические, 621–28
в шаблонах классов, 821–24
указатель this, 616–21
члены базового и производного классов, 870–79
двойная кавычка (\\ ")
как escape-последовательность, 77
двойная обратная косая черта (\\)
как escape-последовательность, 77
двунаправленный итератор, 583
декремента оператор (--)
встроенный, 153–54
перегруженный, 740–44
постфиксная форма, 153, 743
префиксная форма, 153, 742
деление
комплексных чисел, 155
целочисленное, 143
деления по модулю оператор (%), 142
деструктор(ы), 682–89
для элементов массива, 690
динамическое выделение памяти
для массива, 162, 400–402
исчерпание памяти, исключение bad_alloc, 393
как требование к динамически растущему вектору, 253
объектов, 392–406
управление с помощью класса auto_ptr, 395
динамическое освобождение памяти
для массивов, 400–402
объектов, 392–406
константных, 402–3
одиночных объектов, 392–95
оператор delete, 134, 392, 394, 744–53
управление с помощью класса auto_ptr, 395
утечка памяти, 395
директивы, 21–24
директивы связывания, 353–55
в связи с перегрузкой, 438
использование с указателями на функции, 373
для элементов массива
динамическое выделение памяти, 691–94
доступ
к контейнеру
использование итератора для, 261
последовательный доступ как критерий выбора типа, 252
к массиву, 31
индекс, 45
индексирование, 113
к пространству имен
механизмы, компромиссные решения, 68
к членам, 598–99, 607–8
оператор доступа к членам ->, 740
произвольный, итератор с произвольным доступом, 583
уровни, protected, 49
друзья, 730–33
и специальные права доступа, 137, 599–600
перегруженные операторы, 730–33
См. также доступ, класс(ы), наследование, 815–21
Е
емкость контейнерных типов
в сравнении с размером, 253
начальная, связь с размером, 258
З
забой (, 77
заголовочные файлы
как средство повторного использования объявлений функций, 323
по имени
algorithm, 72, 584
bitset, 167
complex, 125
fstream, 1042
functional, 568
iomanip, 136
iterator, 578
limits, 145
locale, 283
map, 293
memory, 395
numeric, 584, 586
queue, 315
set, 304
sstream, 1044
stack, 312
string, 68
vector, 70, 121, 256
предкомпилированные, 385
содержимое
включение определения шаблона функции, преимущества и недостатки, 495
встроенные функции, 353
директивы связывания, 354
объявления, 82, 385–87
объявления явных специализаций шаблонов, 503
спецификация аргументов по умолчанию, 341
запись активации, 327
автоматическое включение объектов в, 388
запятая (,)
неправильное использование для индексации массива, 117
оператор, 163
звонок ()
как escape-последовательность, 77
знак вопроса ()
как escape-последовательность, 77
И
И, оператор, 142
идентификатор, 83
использования в качестве спецификатора типа класса, 129
как часть определения массива, 113
соглашения по именованию, 83
иерархии
определение, 862–69
идентификация членов, 870–80
исключений, в стандартной библиотеке C++, 1026–29
поддержка мезанизма классов, 128
изменчивый (mutable) член, 614–16
именование
соглашения об именовании идентификаторов, 83
имя, 83
typedef, как синоним, 126–27
именование членов класса, 607–8
квалифицированные имена, 410–12
статических членов класса, 622–23
членов вложенных пространств имен, 412–14
шаблонов функций как членов пространства имен, 524
область видимости объявления, 376
параметра шаблона
функции, 478
перегруженные операторы, 727–28
переменной, 83
псевдонимы пространства имен, как альтернативные имена, 420–21
разрешение, 377
в локальной области видимости, 379
в области видимости класса, 649–52
в определении шаблона функции, 514–20
инициализация
векторов, 121
сравнение с инициализацией встроенных массивов, 122
комплексного числа, 154
массива
динамически выделенного, 400
динамически выделенных объектов классов, 749
многомерного, 116
указателей на функции, 369
недопустимость инициализации другим массивом, 115
объектов
автоматических, 388
автоматических, по сравнению с локальными статическими, 391
глобальных, инициализация по умолчанию, 382
динамически выделенных, 393
константных, 101
статических локальных, 390, 391
поведение auto_ptr, 397
сравнение с присваиванием, 148
ссылок, 104
указателя на функцию, 367
влияние на спецификацию исключений, 549
вопросы, связанные с перегруженными функциями, 439
инкремента оператор (++)
встроенный, 154
перегруженный, 740–44
постфиксная форма, 153, 743
префиксная форма, 153, 742
инструкции, 188–98
break
для выхода из инструкции switch, 203
break, инструкция, 218–19
continue, 219
do-while, 216–17
сравнение с инструкциями for и while, 209
for, 209–13
goto, 219–21
if, 20, 192–98
if-else, условный оператор как альтернатива, 158
switch, 201–3
использование ключевого слова default, 202, 205
while, 213–16
сравнение с инструкциями for и do-while, 209
блок, 188
объявления, 189–92
простые, 188–89
составные, 188–89
инструкция
while, 21
использование преобразования квалификаторов, 449
использование шаблонов, 62
итератор с произвольным доступом, 583
итератор(ы), 123, 261
begin(), доступ к элементам контейнера, 261
end(), доступ к элементам контейнера, 261
iterator, заголовочный файл, 578
абстракция, использование а обобщенных алгоритмах для обхода, 552
адаптор, 557
вставка элементов в последовательные контейнеры, 266
доступ к подмножеству контейнера с помощью, 262
использование в обобщенных алгоритмах, 575–83
категории, 582–83
двунаправленный итератор, 583
итератор записи, 582
итератор с произвольным доступом, 583
итератор чтения, 582
однонаправленный итератор, 583
обозначение интервала с включенной левой границей, 583
обратные итераторы, 578
потоковык итераторы ввода/вывода, 578–82
istream_iterator, 579–80
ostream_iterator, 580–82
запись целых чисел из вектора в стандартный вывод, 578
чтение целых чисел из стандартного ввода в вектор, 579
требования к поведению, выдвигаемые обобщенными алгоритмами, 584
удаление элементов из последовательного контейнера, 267
К
китайский язык
поддержка двухбайтовых символьных литералов, 77
класс(ы)
возвращаемые значения, 347–49
вопросы эффективности, 712–18
друзья, 599–600, 731
заголовок, 594
объединение, 638–43
объявление, сравнение с определением класса, 600–601
определение, 594–601
сравнение с объявлением класса, 600–601
параметры
вопросы эффективности, 330, 712–18
для возврата сразу нескольких значений, 350
для передачи сразу нескольких параметров, 350
тело, 594
командная строка
класс, 363–65
опции, 356–65
argc, argv - аргументы main(), 356
использование встроенного массива для обработки, 356
пример программы, 361–63
комментарии, 24–26
блочные, 25
комплексные числа, 18, 125–26
выражения с участием, 155
заголовочный файл complex, 125
как абстракция класса, 30
операции, 154–58
представление, 156
типы данных, 30
композиция
объектов, 963–65
сравнение с наследованием, 960–62
конкретизация
шаблона функции, 482
явное объявление специализации
шаблона функции, 497–98
Конкретизация
шаблона функции
разрешение перегрузки, 506–13
конктеризация
точка конкретизации, 518
константы
константные выражения
sizeof() как пример, 162
размер массива должен быть, 113
литерал, 76–78
подстановка, 386
преобразование объектов в, 101
ссылки, рассматриваемые как, 104
конструктор(ы)
вызовы виртуальных функций в, 923–25
для базовых классов, 899
почленная инициализация, 925–30
при виртуальном наследовании, 974–82
при единичном наследовании, 896
при множественном наследовании, 950–51
для элементов массива
список инициализации массива, 689–91
и функциональные try-блоки, 1024–26
как коверторы, 761–64
конструкторы по умолчанию, 678–79
для элементов вектора, 694–96
копирующие конструкторы, 237, 680–82
почленная инициализация, 703–9, 925–30
ограничение возможности созданий объектов, 680
список инициализации членов, 696–703
контейнерные типы
определение, 256–61
контейнерные типы, 248–301
вопросы выделения памяти при копировании, 577
емкость, 253
связь с размером, 253–58
и итераторы, 261–65
инициализация, с помощью пары итераторов, 263
очереди с приоритетами, 315
параметры, 338–40, 350
преимущества, автоматическое управление памятью, 402
размер, 258
связь с емкостью, 253–56
требования к типам, с которыми конкретизируется контейнер, 259
копирование
вопросы выделения памяти, 577
использование ссылок для избежания, 330
как операция инициализации, 258
массивов, 115
сравнение со стоимостью произвольного доступа, 252
строк, 96
копирующий
конструктор, 43, 131
для динамического увеличения размера вектора, 255
оператор присваивания, реализация, 237
Л
лексикографическое упорядочение, 289
в обобщенных алгоритмах перестановок, 586
в обобщенныых алгоритмах сравнения, 586
при сортировке строк, 366–75
литеральные константы, 76–78
C-строки
сравнение с символьными литералами, 114
f суффикс, 77
U суффикс, 76
с плавающей точкой, 77
логические встроенные операторы, 145–48
оператор ИЛИ (||), 146
оператор НЕ (!), 147
логические объекты-функции
logical_and, 572
logical_not, 572
logical_or, 572
локализация
влияние глобального объекта на, 349
константной переменной или объекта, 100
локальность объявления, 190, 385
на уровне файла, использование безымянного пространства имен, 419
локальная область видимости, 376, 378–81
try-блок, 535
доступ к членам в глобальной области видимости, скрытым за локальными объектами, 411
имена в пространстве имен, скрытые за локальными объектами, 414
переменная, неинициализированная, 388
разрешение имени, 379
локальные объекты, 388–92
проблема возврата ссылки на, 348
статические, 388, 390–92
М
массив(ы), 113–20
в сравнении с векторами, 122
динамическое выделение и освобождение, 400–402
массивов объектов классов, 691–94, 744–53
индексирование, 31, 113–16
многомерных массивов, 116–17
отсутствие контроля выхода за границы диапазона, 116
инициализация, 31, 114–15
динамически выделенных массивов, 400
динамически выделенных массивов объектов класса, 690–94
многомерных массивов, 116–17
недопустимость инициализации другим массивом, 115
использование оператора sizeof(), 159
как параметры функций, 335–39
для передачи нескольких параметров, 350
многомерные, 338
преобразование массива в указатель, 448
многомерные, 116–17
недопустимость использования auto_ptr, 395
недопустимость использования в качестве возвращаемого значения функции, 324
недопустимость присваивания другому массиву, 115
недопустимость ссылок на массив, 115
обход
с помощью манипуляции указателем, 118
с помощью пары итераторов, 263–64
объектов класса, 689–96
определение, 30, 113
перегруженный оператор
delete[], 749–51
new[], 749–51
поддержка обобщенными алгоритмами, 553
размер, не является частью типа параметра, 335
связь с типом указателей, 118–20
указателей на функции, 369–70
меньше, оператор
поддержка в арифметических типах данных, 30
требование о поддержке типом элементов контейнера, 259
минус(-)
для выделения опций в командной строке, 357
многоточие (...), 343–44
использование в типах функций, 367
множество (set), контейнерный тип
set, заголовочный файл, 304
size(), 307
обход, 306–7
ограничение на изменение порядка, 587
определени, 304–6
поиск элементов, 306
сравнение с отображением, 292
модели компиляции
с разделением, 834–37
шаблонов класса
с включением, 833
с разделением, 834–36
шаблонов классов, 831–38
шаблонов функций, 494–98
с включением, 494–95
с разделением, 495–97
Н
наилучшая из устоявших функций, 442
неинициализированный
автоматический объект, 388
глобальный объект, 382
локальный статический объект, 391
неоднозначность
перегруженных
функций, диагносцирование во время разрешения перегрузки, 454
указателя, стандартные преобразования, 456
шаблона функции
аргумента, разрешение с помощью явной спецификации, 492
конкретизации, ошибка, 484
конкретизация, опасность перегрузки, 505
неявные преобразования типов, 176
новая строка ()
как escape-последовательность, 77
О
область видимости, 376–81
видимость класса, 645–52
и определение класса, 594
разрешение имен в, 649–52
глобальная область видимости, 376
и время жизни (глава), 376–428
и перегрузка, 434–38
локальная область видимости, 378–81
обращение к скрытым членам глобальной области видимости, 411
разрешение имен в, 379
объявлений исключений в catch-обработчиках, 540
параметра шаблона
функции, 478–81
пространства имен, 376
управляющих переменных в инструкции for, 379
область видимости глобального пространства имен, 376, 406
доступ к скрытым членам с помощью оператора разрешения области видимости, 411
обобщенные алгоритмы
(глава), 552–92
algorithm, заголовочный файл, 584
numeric, заголовочный файл, 584
алфавитный указатель (приложение), 1103–94
генерирования, 586
использование итераторов, 575–83
категории и описания, 583–87
когда не надо использовать, 587–92
модификации, 586
независимость от типа, 552, 553
нотация для диапазона элементов, 583
обзор, 552–56
объекты-функции как аргументы, 567
использование предопределенных объектов-функций, 569
перестановки, 586
подстановки, 585
пример использования, 556–66
работа с хипом, 587
сравнения, 586
удаления, 585
численные, 586
обработка исключений
bad_alloc, исключение нехватки памяти, 393
обратная косая черта (
как escape-символ, 280
как префикс escape-последовательности, 77
обратные итераторы, 578
обход
заполнение множества с помощью, 305
использование с контейнерами multimap и multiset, 309
множества, 306–7
невозможность обхода перечислений, 112
обход отображения, 303
отображения текста на вектор позиций, 298–301
параллельный обход двух векторов, 296
объединение
разновидность класса, 638–43
объект(ы)
автоматические, 388–89
объявление с ключевым словом register, 389–90
глобальные
и функции, 381–87
сравнение с параметрами и возвращаемыми значениями функций, 349–50
использование памяти, 82
локальные, 388–92
определение, 87
переменные как, 81
члены пространства имен, 407–8
объектное программирование, 593
объектно-ориентированное программирование
проектирование
(пример), 46–55
объекты-функции, 566–75
functional, заголовочный файл, 568
арифметические, 570
использование в обобщенных алгоритмах, 552
источники, 568
логические, 572
предопределенные, 568–70
преимущества по сравнению с указателями на функции, 567
реализация, 573–75
сравнительные, 571
Объекты-функции
адапторы функций для, 573
объявление
инструкция, 14
объявления
базового класса, виртуальное, 976–78
в части инициализации цикла for, 210
видимость имени, вводимого объявлением, 376
друзей, в шаблоне класса, 815–21
и определение, 382–83
инструкция, 189–92
исключения, 538
класса bitset, 167
объектов, 169
класса, сравнение с определением, 600–601
локальность, 190
перегруженное
оператора, 131
функции, 429
пространства имен, 407
сопоставление объявлений в разных файлах, 383
указателя на функцию, 366
включение спецификации исключений в, 548
функции, 322
задание аргументов по умолчанию, 341
как часть шаблона функции, 477
размещение в заголовочном файле, 385
функции-члена, перегруженное, 776–78
шаблона функции
определение используемых имен, 516
связь с определением, 515
требования к размещению явных объявлений конкретизации, 497
явная специализация, 499
явной конкретизации
шаблона класса, 837–38
шаблона функции, 497–98
одиночная кавычка (_)
как escape-последовательность, 77
однонаправленный итератор, 583
оператор "меньше"
характеристики и синтаксис, 146
оператор ввода, 27
оператор вывода, 1045
перегрузка, 1069. См. cout. См. cout
оператор вызова функции, 736–38
операторы
встроенные
(глава), 141–87, 141–87
sizeof, 159–62
арифметические, 142–45
бинарные, 141
декремента (--), 153–54
доступа к членам класса (. и ->), 607–8
запятая, 163
инкремента (++), 153–54
логические, 145–48
побитовые, 164–66
приоритеты, 171–74
равенства, 145–48
разрешения области видимости (
), 410–12
составного присваивания, 152
сравнения, 145–48
перегруженные
delete, 744–49
delete(), размещения, 751–53
delete[], 749–51
new, 744–49
new(), размещения, 751–53
new[], 749–51
взятия индекса ([]), 736
вопросы проектирования, 728–30
вызова функции (()), 736–38
вызова функции для объектов-функций, 567
декремента (--), 740–44
доступа к членам (->), 738–40
имена, 727–28
инкремента (++), 740–44
объявленные как друзья, 730–33
присваивания (=), 733–35
с параметрами-ссылками, преимущества, 335
члены и не-члены класса, 723–27
определения, 15
typedef, 126
базового класса, 871–75
иерархии классов, 862–69
исключений, как иерархий классов, 1013–14
класса, 594–601
сравнение с определением класса, 600–601
класса-диспетчера запросов (пример), 934–39
массива, 113
многомерных массивов, 116
множеств, 304–6
недопустимость размещения в заголовочном файле, 385
объекта, 382
объектов класса bitset, 169
объектов класса complex, 125
последовательных контейнеров, 256–61
производного класса, 876–78
пространств имен, 406–20
членов, 415–17
сравнение с объявлениями, 381–83
функции
и локальная область видимости, 378
как часть шаблона функции, 477
шаблона класса, 791–800
разрешение имен в, 844–46
опции
в командной строке, 356–65
отображения, 292–309
map, заголовочный файл, 293
заполнение, 293
невозможность переупорядочения, 587
недопустимость использования итераторов с произвольным доступом, 583
сравнение с множествами, 292
текста
заполнение, 292–98
определение, 292–98
отрицатели
как адапторы функций, 573
очереди, 315–16
queue, заголовочный файл, 315
size(), 315
top(), функция, 316
очереди с приоритетами, 315, 316
очередь с приоритетами, 315
size(), 315
top(), функция, 316
ошибки
assert(), макрос, 226
бесконечная рекурсия, 351
в инструкции if, 193
в циклах, 197
зацикливание, 93
висячие указатели, 389
как избежать, 394
динамического выделения памяти, 395
итератор, использование, 226
компиляции, конфликты в области видимости using-объявления, 437
массив
индекс за концом, 94
области видимости, подводные камни using-директивы, 426
оператор присваивания вместо оператора равенства, 100
порядка вычисления подвыражений, 142
проблема висячего else, 195
проблемы константных ссылок и указателей, 106
проблемы побитовых операторов, 166
проблемы, связанные с глобальными объектами, 349
пропуска
завершающего нуля в C-строке, 402
скобок при освобождении динамически выделенного массива, 402
редактора связей
повторные определения, 386
смещения на единицу при доступе к массиву, 31
фазы связывания при наличии объявления в нескольких файлах, 383
Ошибки
конкретизации шаблона функции, 484
П
память
утечка, 35
параметр(ы)
объявление, сравнение с объявлением исключений, 540
размер, важность для передачи по значению, 327
списки параметров
переменной длины, многоточие, 343
различия перегруженных функций, 431
ссылочные, 329–33
влияние на преобразования при разрешении перегрузки функции, 457
преимущества эффективности, 330, 540
ранжирование, 471
сравнение с параметрами-указателями, 333–35
шаблона
использование указателей на константы, 101
не являюшиеся типами, 476
являюшиеся типами, проверка, 325–26
параметры функций
аргументы по умолчаниюю, 340–43
использования многоточия, 343–44
массивы, 335–39
при разрешении перегруженных функций, 430
проверка типов, 325–26
списки параметров, 325
сравнение параметров указательного и ссылочного типов, 333–35
сравнение с глобальными объектами, 349–50
ссылки, 107, 329–33
использование для возврата нескольких значений, 197
на константы, 331
преимущества в эффективности, 330
сравнение с параметрами-указателями, 333–35
тип возвращаемого значения
тип pair, 197
указатели, 329
указатели на функции, 370–73
переменные
глобальные параметры и возвращаемые значения, 349–50
константные, 100
объявление как член пространства имен, 408
переносимость
знак остатка, 143
перестановки, обобщенные алгоритмы, 589
перечисления, 110–13
основания для включения в язык, 110
расширение типа при разрешении перегрузки функции, 452
точное соответствие при разрешении перегрузки функции, 445
по умолчанию
аргументы, 340–43
и виртуальные функции, 910–13
влияние на выбор устоявших функций, 472
и устоявшие функции, 472–73
конструктор, см. конструктор, 678–79
побитовый(е)
оператор И (&), 164
оператор И с присваиванием (&=), 152, 164
оператор ИЛИ (!), 165
оператор ИСКЛЮЧАЮЩЕЕ ИЛИ (^), 165
оператор НЕ (~), 164
оператор сдвига (<<,>>), 165
операторы, 164–66
поддержка в классе bitset, 170
повторное возбуждение
исключения, 542–43
позиция
разрешение аргумента по позиции в списке, 341
поиск
rfind(), 278
подстрок, 280
элементов
множества, 306
отображения текста, 298–99
ПОО (правило одного определения), 382, 416–18
последовательные контейнеры, 248–319
вставка элементов, 265
критерии выбора, 252
обобщенные алгоритмы, 269–70
определение, 256
перестановка элементов, 269
присваивание, 268
удаление элементов, 267
предостережения
использование знакового бита в битовых векторах, 166
неопределенность порядка вычисления бинарных операторов сравнения, 147
опасности приведения типов, 178
подводные камни
using-директивы, 426
возврата l-значение, 348
возврата ссылки на объект, 348
глобальные объекты, 349
приведения типов, 181
шаблона класса auto_ptr, 399
представление
влияние на расширение типа перечисления, 452
информация о реализации в заголовочном файле limits, 145
строк, 92
целых чисел,
143
преобразование
bool в int, 109
l-значения в r-значение, 446–47
арифметическое, 177–78
бинарного объекта-функции в унарный, использование адаптора-связывателя, 573
выбор преобразования между типами классов, 764–76
выведение аргументов шаблона функции, 486
как точное соответствие при разрешении перегрузки функции, 459
квалификаторов
влияние на последовательность преобразований, 470
при выведении аргументов шаблона функции, 487
ранжирование при разрешении перегрузки функции, 470
конверторы, 445
конструкторы
конструкторы как конверторы, 761–64
множественные, разрешение неоднозначности приведения, 468
недопустимость преобразований между типами указателей на функции, 439
неявные преобразования типов, 176
определенное пользователем, 445
последовательности
определенных пользователем преобразований, 764–67
определенных пользователем, ранжирование при разрешении перегрузки функций, 771–76
определенных пользователем, с учетом наследования, 1034–36
стандартных преобразований, 468–72
ранжирование инициализации ссылок при разрешении перегрузки функции, 457
расширения типа, 175
аргументов, 451–53
типа перечисления в арифметические типы, 112
с потерей точности, предупреждение компилятора, 326
стандартное, 453–57
типа аргумента, 444–60
трансформации l-значений, 450
трансформация I-значений
преобразования при выведении аргументов шаблона функции, 486
трансформация I-значения
ранжирование при разрешении перегрузки функции, 468
указателей
в тип void* и обратно, 179
преобразования квалификаторов, 449
стандартные преобразования указателей, 456
трансформации l-значений, массива в указатель, 448
трансформации l-значений, функции в указатель, 448
явные преобразования типов, 144, 175, 178
препроцессор
комментарий
парный(/**/), 25
константы
__cplusplus__, 23
макросы
шаблоны функций как более безопасная альтернатива, 474
предкомпилированные заголовочные файлы, 385
приведение(я), 144
const_cast, оператор, опасность применения,, 180
dynamic_cast (), оператор, 1001–7
dynamic_cast()
идентификация класса объекта во время выполнения, 182
reinterpret_cast
опасности, 181
reinterpret_cast, оператор, 181
static_cast
сравнение с неявными преобразованиями, 180
static_cast, оператор, 181
выбор конкретизируемого шаблона функции, 485
для принудительного установления точного соответствия, 450
опасности, 181
сравнение нового синтаксиса со старым, 182
старый синтаксис, 182–83
применение для подавления оптимизации, 127
примеры
класс IntArray, 45
IntSortedArray, производный класс, 54
класс iStack, 183–87
поддержка динамического выделения памяти, 316–17
преобразование в шаблон stack, 318–19
класс String, 128–39
класс связанного списка, 221–47
обработка аргументов в командной строке, 356–57
система текстового поиска
(глава 6), 248–319
функция sort, 365
шаблон класса Array, 55–62, 849–57
SortedArray, производный класс, 993–98
примитивные типы
(глава), 98–139
присваивание
векторам, сравнение с встроенными массивами, 122
и поведение auto_ptr, 397
комплексных чисел, 155
массиву, недопустимость присваивания другого массива, 115
оператор
и требования к l-значению, 81
перегруженный, 709–12, 733–35
составной, 152
последовательному контейнеру, 268–69
почленное для объектов класса, 709–12
ссылке, 107
указателю на функцию, 367
вопросы, связанные с перегруженностью функции, 439
проверка
выхода за границы диапазона, 289
не выолняется для массивов, 116
типа
назначение и опасности приведения типов, 182
неявные преобразования, 326
объявления, разнесенного по нескольким файлам, 384
отмена с помощью многоточия в списке параметров, 343
параметра, 325–27
сохранения в шаблоне функции, 476
указателя, 88
программа, 14–21
производительность
auto_ptr, 397
классы, локальность ссылок, 191
компиляции
зависимость от размера заголовочного файла, 385
при конкретизации шаблонов функций, 497
контейнеров
емкость, 255
компромиссы при выборе контейнера, 252
сравнение списка и вектора, 254
определения шаблона функции в заголовочном файле, 495
сравнение обработки исключений и вызовов функций, 550
ссылок
объявление исключений в catch-обработчиках, 540
параметры, 330
параметры и типы возвращаемых значений, 389
указателей на функции
проигрыш по сравнению с параметрами-ссылками, 540
проигрыш по сравнению со встроенными функциями, 559
сравнение с объектами-функциями, 567
функций
вопросы, связанные с возвращаемыми значениями, 324
накладные расходы на вызов рекурсивных функций, 351
недостатки, 352
передачи аргументов по значению, 328
преимущества встроенных функций, 133
производные классы
деструкторы, 896–99
конструирование, 889–96
почленная инициализация, 925–27
конструкторы, 892–93
определение
при виртуальном наследовании, 976–78
при множественном наследовании, 950–55
присваивание почленное, 927–28
пространства имен, 406–20
безымянные, 418–20
инкапсуляция сущностей внутри файлов, 419
отличие от других пространств имен, 419
вложенные, 412–14
и using-объявления,
435
объявления перегруженных функций внутри, 434–38
глобальное, 376
доступ к скрытым членам с помощью оператора разрешения области видимости, 411
проблема загрязнения пространства имен, 406
область видимости, 376
std, 426–28
определения, 408–10
определенные пользователем, 407
псевдонимы, 420–21
члены
определения, 416
требование правила одного определения, 416–18
шаблоны функций, 521–24
процедурное программирование
(часть 3), 592–782
псевдоним(ы)
имен типов, typedef, 127
пространства имен, 66, 420–21
Р
равенство
оператор(ы), 145–48
потенциальная возможность выхода за границы, 116
разрешение перегрузки функции, 443
(глава), 429–73
выбор преобразования, 767
детальное описание процедуры, 460–73
наилучшая из устоявших функция, 453
для вызовов с аргументами типа класса, 771–76
и перегрузка, 468–72
ранжирование
последовательностей определенных пользователем преобразований, 1034–36
последовательностей стандартных преобразований, 468–72
устоявшие функции, 465–68
для вызовов операторных функций, 787–88
для вызовов функций-членов, 779–82
и аргументы по умолчанию, 472–73
и наследование, 1034–36
функции-кандидаты, 461–65
для вызовов в области видимости класса, 770–71
для вызовов операторных функций, 783–87
для вызовов с аргументами типа класса, 767–70
для вызовов функций-членов, 778
и наследование, 1031–34
явные приведения как указания компилятору, 451
разрешения области видимости оператор (
)
доступ к членам глобальной области видимости, 411
), 410–12
)
доступ к членам вложенного пространства имен, 412–14
Разрешения области видимости оператор (
)
доступ к шаблону функции как члену пространства имен, 524
разыменования оператор (*)
использование с возвращенным типом указателя, 367
как унарный оператор, 141
не требуется для вызова функции, 368
опасности, связанные с указателями, 333
приоритет, 118
ранжирование
определений шаблона функции, 505
последовательностей стандартных преобразований, 468–72
рассказ об Алисе Эмме, 250
и реализация класса string, 137
рекурсивные функции, 352
С
С, язык
символьные строки
использование итератора istream_iterator, 579
функции
указатели на функции, 373
связыватель
как класс адаптора функции, 573
сигнатура, 325
символ(ы)
литералы
синтаксис записи, 77
массив символов, инициализация, 114, 115
нулевой, для завершения строкового литерала, 78
символы
& (амперсанд)
оператор взятия адреса
использование в определении ссылки, 104
&& (двойной амперсанд)
оператор логического И, 146
символы
(двойное двоеточие)
оператор разрешения области видимости класса, 42
(двойное двоеточие)
оператор разрешения области видимости, 410–12
-- (двойной минус)
оператор декремента, 153, 740–44
- (минус)
использование для обозначения опций в командной строке, 357
! (восклицательный знак)
оператор "логическое НЕ"
вычисление, 147
характеристики и синтаксис, 145
% (процент)
оператор деления по модулю, 142
оператор вычисления остатка, характеристики и синтаксис, 143
%= (процент равно)
оператор вычисления остатка с присваиванием, 152
& (амперсанд)
оператор взятия адреса
использование с именем функции, 164
как унарный оператор, 141
оператор побитового И, 164
&& (двойной амперсанд)
оператор логического И, 142
&= (амперсанд равно)
оператор побитового И с присваиванием, 164
как оператор составного присваивания, 152
() (круглые скобки)
использование оператора вызова для передачи объекта-функции, 567
оператор вызова, перегрузка в объектах-функциях, 559
(обратная косая черта a)
escape-последовательность "звонок", 77
(обратная косая черта n)
escape-последовательность "новая строка", 77
(обратная косая черта v)
escape-последовательность "вертикальная табуляция", 77
(обратная косая черта знак вопроса)
escape-последовательность "знак вопроса", 77
(обратная косая черта)
как escape-символ, 280
* (звездочка)
оператор разыменования
доступ к объектам с помощью, 89
использование для задания типа возвращаемого значения, 366
как унарный оператор, 141
не требуется для вызова функции, 368
определение указателей с помощью, 87
приоритет, 118
оператор умножения
характеристики и синтаксис, 142
*= (звездочка равно)
оператор умножения с присваиванием, 152
, (запятая)
неправильное применение для индексации массива, 117
оператор, 163
. (точка)
оператор "точка", 38
... (многоточие), 343–44
для обозначения универсального catch-обработчика, 544
использование в типах функций, 367
/ (косая черта)
оператор деления
характеристики и синтаксис, 142
/= (косая черта равно)
оператор деления с присваиванием, 152
; (точка с запятой)
для завершения инструкций, 188
?: (знак вопроса двоеточие)
условный оператор, 133, 158
сокращенная запись if-else, 199
[,) (левая квадрнатная, правая круглая скобки)
для обозначения интервала с включенной левой границей, 583
[] (квадратные скобки)
для динамического выделения памяти под массив, 400
для освобождения выделенной под массив памяти, 402
оператор взятия индекса
для доступа к вектору, 121
для проверки битов в битовом векторе, 168
инициализация отображения с помощью, 294
не поддерживается для контейнеров multiset и multimap, 312
оператор взятия индекса, 736
оператор индексирования массива, перегрузка в определении класса массива, 45
\\ " (обратная косая черта двойная кавычка)
escape-последовательность двойной кавычки, 77
\\ (двойная обратная косая черта)
escape-последовательность "обратная косая черта", 77
\\t (обратная косая черта t)
escape-последовательность горизонтальнаятабуляция, 77
^ (крышка)
оператор побитового ИСКЛЮЧАЮЩЕГО ИЛИ, 164
^= (крышка равно)
оператор побитового ИСКЛЮЧАЮЩЕГО ИЛИ с присваиванием, 164
как оператор составного присваивания, 152
__STDC__, 23
_обратная косая черта одиночная кавычка)
escape-последовательность "одиночная кавычка", 77
{} (фигурные скобки)
использование в объявлениях пространств имен, 408
использование в предложении catch, 536
использование в составной директиве связывания, 354
как ограничители составной инструкции, 188
при инициализации вложенного массива, 117
| (вертикальная черта)
оператор побитового ИЛИ, 164
|| (двойная вертикальная черта)
оператор логического ИЛИ
характеристики и синтаксис, 145
оператор логического ИЛИ
вычисление, 146
|= (вертикальная черта равно)
оператор побитового ИЛИ с присваиванием, 164
как оператор составного присваивания, 152
~ (тильда)
оператор побитового НЕ, 164
+ (плюс)
оператор сложения
поддержка в арифметических типах данных, 30
++ (двойной плюс)
оператор инкремента, 153, 740–44
+= (плюс равно)
оператор сложения с присваиванием, 146
+= (плюс равно)оператор сложения с присваиванием
как оператор составного присваивания, 152
< (левая угловая скобка)
оператор "меньше"
вопросы поддержки, 566
использование при сортировке по длине, 558
перегруженный оператор в определении контейнера, 259
<< (двойная левая угловая скобка)
оператор вывода, 26
оператор сдвига влево, 164
<<=(двойная левая угловая скобка равно)
оператор левого сдвига с присваиванием, 152
<> (угловые скобки)
явный шаблон
применение в специализациях, 499
спецификации аргументов, 490
-= (минус равно)
оператор вычитания с присваиванием, 152
= (равно)
оператор присваивания, 100, 733–35
и l-значение, 81
использование с объектами классов, 39
использование с псевдонимами пространств имен, 420
== (двойное равно)
оператор равенства, 100
поддержка в арифметических типах данных, 30
оператор равенства, необходимость наличия в определении контейнера, 259
-> (минус правая угловая скобка)
оператор "стрелка"
перегруженный оператор доступа к членам, 740
>> (двойная правая угловая скобка)
оператор ввода, 1051–63
перегрузка. cin. cin
оператор сдвига вправо, 164
>>=(двойная правая угловая скобка равно)
оператор правого сдвига с присваиванием, 152
символы:, 77
сложения (+) оператор
комплексных чисел, 155
сокрытие информации, 39, 598
вопросы, связанные с вложенными пространствами имен, 414
доступ к
закрытым членам класса, 607
имена в локальной области видимости, 378
объявление члена пространства имен, обход с помощью оператора разрешения области видимости, 411
параметры шаблона, имена в глобальной области видимости, 478
сравнение с перегрузкой, 434
во вложенных областях видимости, 461
члены глобальной области видимости, доступ с помощью оператора разрешения области видимости, 411
составные
выражения, 142
инструкции, 188–89
директивы связывания, 354
присваивания
оператор, 152
операторы над комплексными числами, 156
состояния условий
в применении к библиотеке iostream, 1086–88
спецификации
явные, аргументов шаблона функции, 490
списки
list, заголовочный файл, 256
merge(), обобщенный алгоритм
специализированная реализация для списка, 588
push_front(), поддержка, 257
size(), 221
влияние размера объекта на производительность, 254
как последовательный контейнер, 256–61
неприменимость итераторов с произвольным доступом, 583
неприменимость обобщенных алгоритмов, требующих произвольного доступа, 588
обобщенные, 241–47
поддержка операций merge() и sort(), 269
сравнение с векторами, 251–52
требования к вставке и доступу, 252
списки параметров переменной длины
использование многоточия, 343
сравнения
объекты-функции, 571
операторы, 145–48
поддержка в контейнерах, 258
ссылки
для объявления исключения в catch-обработчике, 543
инициализация
как преобразование точного соответствия, 457–59
ранжирование при разрешении перегрузки функции, 471–72
ссылки на const, 105–8
использование с sizeof(), 161
как тип возвращаемого значения функции, 348
недопустимость массив ссылок, 115
параметры-ссылки, 107, 329–33
необходимость для перегрузки операторов, 335
преимущества эффективности, 330
парамтеры-ссылки
по сравнению с параметрами-указателями, 333–35
сравнение с указателями, 104
статические объекты
объявление локальных объектов как, 390–92
объявление, сравнение с безымянным пространством имен, 419
статические члены класса
указатели на, 636–37
статическое выделение памяти, 33
стек, контейнерный тип, 312–15
stack, заголовочный файл, 312
top(), функция, 154, 313
динамическое выделение памяти, 317
операции (таблица), 313
реализация с помощью контейнера deque, 314
стека, пример класса, 183–87, 183–87
строки
append(), 287–88
assign(), 287
compare(), 289
erase(), 267, 285
insert(), 266
replace(), 290–91
swap(), 268, 288
поиск подстроки, 273–79, 285–86, 290
присваивание, 266
Т
тело
функции, 321
тип
точное соответствие, 445–51
тип(ы)
bool, 108–10
C-строка, 92–95
typedef, синоним типа, 126
арифметические, 30–33
базовые
(глава), 98–139
для определения нескольких объектов одного и того же типа pair, 128
имя класса как, 595
использование с директивой препроцессора include, 68
поверка
назначение и опасности приведения, 182
проверка
неявные преобразования, 326
объявления в нескольких файлах, 384
подавление, многоточие в списке параметров функции, 343
сравнение, функция strcmp(), 133
С-строка
динамическое выделение памяти, 401
точка конкретизации
шаблона функции, 518
точное соответствие, 445–51
У
угловые скобки (<>)
шаблон
использование для определения, 56
спецификации аргументов, 490
явные
специализации шаблона, 498
спецификации аргументов шаблона, 490
указатели, 87–90
sizeof(), использование с, 161
void*, 89
преобразование в тип void* и обратно, 179
адресация
C-строк, 92
объектов, 89
объектов класса, использование оператора ->, 603
элементов массива, 118
вектор указателей, преимущества, 255
висячий
возвращенное значение, указывающее на автоматический объект, 389
указывающий на освобожденную память, 394
использование в обобщенных алгоритмах, 120
как значение, возвращаемое функцией, 370
как итераторы для встроенного массива, 264
константные указатели, 101
на константные объекты, 101
нулевой указатель, 455
как операнд оператора delete, 394
параметры, 329, 334
сравнение с параметрами-ссылками, 333–35
сравнение с массивами, 118–20
сравнение со ссылками, 43, 106
указатели на функции, 365–75
вызов по, 368–69
и спецификации исключений, 548–50
инициализация, 367
как возвращаемые значения, 370–73
как параметры, 370–73
массивы, 369–70
на перегруженные функции, 439–40
на функции, объявленные как extern "C", 373–75
написанные на других языках, 374
недостатки по сравнению со встроенными функциями, 559
присваивание, 367
сравнение с указателями на данные (сноска), 87
указатели на члены, 628–38
указатели на данные-члены, 634
указатели на статические члены, 636–38
указатели на функции-члены, 632
умножения оператор (*)
поддержка в арифметических типах данных, 30
унарные операторы, 141
условный
директивы препроцессора, 21
инструкции
if, 192–98
инструкция
switch, 201–3
оператор (?
)
сравнение с функциями, 352
оператор (?:), 133
сокращение для if-else, 199
условный оператор
инструкция, 188
Ф
файл(ы)
ввод/вывод, 28–29
входной
открытие, 28
выходной
открытие, 29
несколько
размещение определения пространства имен в, 410
сопоставление объявлений в, 383
объявления локальных сущностей
использование безымянного пространства имен, 419
фигурные скобки ({})
использование в объявлениях пространств имен, 408
использование в предложении catch, 535
использование в составной директиве связывания, 354
как ограничители составной инструкции, 188
при инициализации вложенного массива, 117
функции
(глава), 320–75
function, заголовочный файл, 568
try-блок, 536
возвращаемые значения, 346–50
локальный объект, проблема возвращения ссылки на, 348
объект класса, 348–50
объект класса как средство вернуть несколько значений, 350
параметр-ссылка как средство возврата дополнительного значения, 329
сравнение с глобальными объектами, 349–50
указатель на функцию, 372
вызовы, 322
заключенные в try-блок, 536
недостатки, 352
сравнение с обработкой исключений, 542
и глобальные объекты, 381–87
и локальная область видимости, 378
имя функции
перегрузка, 429
преобразуется в указатель, 367
интерфейс
объявление функции как, 323
прототип функции как описание, 323
конверторы, 757–61
конструкторы как, 761–64
локальное хранение, 327
на другом языке, директивы связывания, 353–55
обращение к, 322
объявления
как часть шаблона функции, 477
как члена пространства имен, 407
сравнение с определениями, 382
объявления перегруженных функций, 429–32
и область видимости, 434–38
как перегружаются, 429–32
когда не надо перегружать, 432–34
причины для перегрузки функций, 429
оператор вызова функции (()), 736–38
определение, 321
как часть шаблона функции, 477
сравнение с объявлениями, 382
преимущества, 352
преобразование функции в указатель, 448
прототип, 323–27
рекурсивные, 350–52
сигнатура, 325
списки параметров, 325
тип
недопустимость возврата из функции, 324
преобразование в указатель на функцию, 347
тип возвращаемого значения, 324–25
недопустимость указания для конструкторов, 671
недостаточен для разрешения перегруженных функций, 431
ссылка, 348
указатель на функцию, 370–73
функции-кандидаты, 442, 460–65
вызов с аргументами типа класса, 767–70
для вызовов в области видимости класса, 770–71
для вызовов функций-членов, 778
для перегруженных операторов, 783–87
для шаблонов функций,, 507
наследование и, 1031–34
функции-члены, 129, 596–98, 604–14
встроенные функции
сравнение с не-встроенными, 605–7
вызов, 131
модификация для обработки исключений, 531
независимые от типа, 50
определение, 132
открытые
доступ к закрытым членам с помощью, 40
сравнение с закрытыми, 608–10
перегруженные
и разрешение, 776–82
объявление, 777–78
проблемы, 434
функции-кандидаты, 778
специальные, 610–11
статические, 626–27
устоявшие, перегрузка и, 779–82
Х
хип, 162, 392, 587
выделение памяти для классов в, 749–51
выделение памяти для массива в, 400
выделение памяти для объекта в, 392
исключение bad_alloc, 393
обобщенные алгоритмы, 587, 1191
См. также обобщенные алгоритмы, 1192
Ц
целые
константы, перечисления как средство группировки, 110
расширение булевских константы до целых, 146
расширение типа, 177
стандартные преобразования, 177
при разрешении перегрузки функции, 453
типы данных, 75
цикл(ы), 20
завершение
break, инструкция, 218
continue, инструкция, 219
инструкции
for, 196
while, 213–16
инструкции
do-while, 216–17
for, 209–13
while, 21
ошибки программирования, 198
бесконечные циклы, 274
условие останова, 32
Ч
числа с плавающей точкой
арифметика, характеристики и смежные темы, 145
правила преобразования типов, 177
стандартные преобразования при разрешении перегрузки функции, 453
численные обобщенные алгоритмы, 586
numeric, заголовочный файл, 586
читабельность
typedef, 126
в объявлениях указателей на функции, 369
как синоним контейнерных типпов, 295
имен параметров, 325
имен перегруженных функций, 432
квалификатор const для объявления констант, 100
параметров-ссыслок, 335
разделение обработчиков исключений, 534
рекурсивных функций, 351
члены класса
this
использование в перегруженном операторе присваивания, 710
когда использовать в функциях-членах, 619–21
указатель this, 616–20
битовые поля, 643–45
данные-члены, 594–96
защищенные, 871
изменчивые (mutable), 614–16
статические, 621–25
тип члена, 631–36
доступ, 599–600, 607–8
друзья, 599–600
статические, 621–28
функции-члены, 596–98, 604–16
встроенные и не-встроенные, 605–7
закрытые и открытые, 608–10
конверторы, 757–61
перегруженные, объявления, 776–78
специальные функции-члены, 610–11
спецификации исключений для, 1021–24
статические, 626–28
тип члена, 631–33
члены-классы
открытые и закрытые, 598–99
шаблоны, 826–31
Ш
шаблон класса Array
Array_RC, производный класс, 990–92
шаблоны классов
(глава), 791–857
вложенные типы, 824–26
и пространства имен, 846–48
модели компиляции, 831–38
с включением, 833
с разделением, 834–37
объявления друзей в, 815–21
определения, 791–800
разрешение имен в, 844–46
параметры, 794–97, 805–11
параметры-константы, 805–11
параметры-типы, 800–805
статические члены классов, 821–24
точка конкретизации, для функций-членов, 846
частичные специализации, 842–44
члены
функций, 811–15
явные
объявления конкретизации, 837–38
специализации, 838–42
шаблоны функций
(глава), 592–782
и пространства имен, 521–24
конкретизации, 592–782
модели компиляции, 494–98
с включением, 494–95
с разделением, 495–97
определение, 474–82
параметры, 475–82
для повышения гибкости обобщенных алгоритмом, 566
параметры-константы, 476
параметры-типы, 476
перегрузка, 503–6
передача объектов-функций шаблону, 569
разрешение имен в определениях, 514–20
разрешение перегрузки при конкретизации, 506–14
тип возвращаемого значения и выведение аргументов шаблона, 491
точка конкретизации, 518
явные
аргументы, 490–93
объявления конкретизации, 497–98
спецаиализации, 498–503
Э
эффективность
сравнение с гибкостью при выделении памяти, 33
Я
явное
преобразование, 178–82
преобразование типа, 144, 175
[1]
Во время написания этой книги не все компиляторы С++ поддерживали пространства имен. Если ваш компилятор таков, откажитесь от данной директивы. Большинство программ, приводимых нами, используют компиляторы, не поддерживающие пространство имен, поэтому директива using
в них отсутствует.
[2]
Как было сказано ранее, не все компиляторы поддерживают пространства имен, поэтому эта разница проявляется только для последних версий компиляторов.
[3] Объявление функции inline – это всего лишь подсказка компилятору. Однако компилятор не всегда может сделать функцию встроенной, существуют некоторые ограничения. Подробнее об этом сказано в разделе 7.6.
[4] Вот как выглядит общее решение этой проблемы:
Example2( elemType nval = elemType() ) " _val( nval ) {}
[5]
На самом деле для указателей на функции это не совсем так: они отличаются от указателей на данные (см. раздел 7.9).
[6] STL расшифровывается как Standard Template Library. До появления стандартной библиотеки С++ классы vector, string и другие, а также обобщенные алгоритмы входили в отдельную библиотеку с названием STL.
[7]
Проверку на неравенство 0 можно опустить. Полностью эквивалентна приведенной и более употребима следующая запись: ptr && *ptr.
[8]
До принятия стандарта языка С++ видимость объектов, определенных внутри круглых скобок for, простиралась на весь блок или функцию, содержащую данную инструкцию. Например, употребление двух циклов for внутри одного блока
{
// верно для стандарта С++
// в предыдущих версиях C++ - ошибка:
ival определена дважды
for (int ival = 0; ival < size; ++iva1 ) // ...
for (int ival = size-1; ival > 0; ival ) // ...
}
в ранних версиях языка вызывало ошибку: ival определена дважды. В стандарте С++ данный текст синтаксически правилен, так как каждый экземпляр ival является локальным для своего блока.
[9]
Замечание. Для упрощения программы мы требуем, чтобы каждое слово было отделено пробелом от скобок и логических операторов. Таким образом, запросы вида
(War || Rights)
Civil&&(War||Rights)
не будут поняты нашей системой. Хотя удобство пользователей не должно приноситься в жертву простоте реализации, мы считаем, что в данном случае можно смириться с таким ограничением.
[10]
Иллюстрация Елены Дрискилл (Elena Driskill).
[11]
Отметим, что deque не поддерживает операцию reserve()
[12]
Существующие на сегодняшний день реализации не поддерживают шаблоны с параметрами по умолчанию. Второй параметр – allocator – инкапсулирует способы выделения и освобождения памяти. В С++ он имеет значение по умолчанию, и его задавать не обязательно. Стандартная реализация использует операторы new и delete. Применение распределителя памяти преследует две цели: упростить реализацию контейнеров путем отделения всех деталей, касающихся работы с памятью, и позволить программисту при желании реализовать собственную стратегию выделения памяти. Определения объектов для компилятора, не поддерживающего значения по умолчанию параметров шаблонов, выглядят следующим образом:
vector< string, allocator > svec;
list< int, allocator > ilist;
[13]
Если функция-член push_front()
используется часто, следует применять тип deque, а не vector: в deque
эта операция реализована наиболее эффективно.
[14]
Последняя форма insert()
требует, чтобы компилятор работал с шаблонами функций-членов. Если ваш компилятор еще не поддерживает это свойство стандарта С++, то оба контейнера должны быть одного типа, например два списка или два вектора, содержащих элементы одного типа.
[15]
Программа компилировалась компилятором, не поддерживающим значений параметров по умолчанию шаблонов. Поэтому нам пришлось явно указать аллокатор:
vector<string,allocator> *lines_of_text;
Для компилятора, полностью соответствующего стандарту С++, достаточно отметить тип элементов:
vector<string> *lines_of_text;
[16]
Конечно, в английском языке существуют исключения из правил. Наш эвристический алгоритм превратит crises
(множ. число от crisis – прим. перев.) в cris. Ошибочка!
[17] Таким образом, как мы видим, определения встроенных функций могут встретиться в программе несколько раз! – Прим. ред.
[18]
Полный текст реализации класса CommandOpt можно найти на Web-сайте издательства Addison-Wesley.
1. Если имеющийся у Вас компилятор пока не поддерживает параметр шаблонов по умолчанию, то конструктору istream_iterator необходимо будет явно передать также и второй аргумент: тип difference_type, способный хранить результат вычитания двух итераторов контейнера, куда помещаются элементы. Например, в разделе 12.2 при изучении программы, которая должна транслироваться компилятором, не поддерживающим параметры шаблонов по умолчанию, мы писали:
typedef vector<string,allocator>::difference_type diff_type
istream_iterator< string, diff_type > input_set1( infile1 ), eos;
istream_iterator< string, diff_type > input_set2( infile2 );
Если бы компилятор полностью удовлетворял стандарту C++, достаточно было бы написать так:
istream_iterator< string > input_set1( infile1 ), eos;
istream_iterator< string > input_set2( infile2 );
1 Более подробное обсуждение этой темы с примерами и приблизительными оценками производительности см. в [LIPPMAN96a].
2 В реальной программе мы объявили бы член _name как имеющий тип string. Здесь он объявлен как C-строка, чтобы отложить рассмотрение вопроса об инициализации членов класса до раздела 14.4.
3 Для тех, кто раньше программировал на C: приведенное выше определение класса Account на C выглядело бы так:
typedef struct {
char *_name;
unsigned int _acct_nmbr;
double _balance;
} Account;
4 См. статью Джерри Шварца в [LIPPMAN96b], где приводится дискуссия по этому поводу и описывается решение, остающееся пока наиболее распространенным.
5 Сигнатура ассоциированного конструктора имеет следующий смысл. Копирующий конструктор применяет некоторое значение к каждому элементу по очереди. Задавая в качестве второго аргумента объект класса, мы делаем создание временного объекта излишним:
explicit vector( size_type n, const T& value=T(), const Allocator&=Allocator());
1 Напомним, что для упрощения реализации необходимо, чтобы между любыми двумя словами, включая скобки и операторы запроса, был пробел. В реальной системе такое требование вряд ли разумно, но мы полагаем, что для вводного курсе, каковым является наша книга, это вполне приемлемо.
2 В объявлении унаследованной виртуальной функции, например eval(), в производном классе ключевое слово virtual необязательно. Компилятор делает правильное заключение на основе сравнения с прототипом функции.
3 Увы! Правые скобки не распознаются, пока OrQuery не выведет все ассоциированное с ним частичное решение.
[19]
Полный текст программы можно найти на FTP-сайте издательства Addison-Wesley по адресу, указанному на задней стороне обложки.
1 Здесь есть потенциальная опасность появления висячей ссылки, если пользователь сохранит адрес какого-либо элемента исходного массива перед тем, как grow() скопирует массив в новую область памяти. См. статью Тома Каргилла в [LIPPMAN96b].
1 Кроме того, программист может устанавливать и сбрасывать флаги состояния формата с помощью функций-членов setf() и unsetf(). Мы их рассматривать не будем; исчерпывающие ответы на вопросы, относящиеся к этой теме, можно получить в [STROUSTRUP97].
[O.A.1]Как должны быть оформлены ссылки на книги, указанные в библиографии? Пришлите ваши пожелания.
[O.A.2]Нумерация сносок сбита, как и вся остальная. Необходима проверка.
[O.A.3]Нумерация сносок сбита.
[O.A.4]Нумерация сносок сбита.
[O.A.5]Нумерация сносок сбита.
[O.A.6]Нумерация сносок сбита.