Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Липпман.doc
Скачиваний:
7
Добавлен:
14.08.2019
Размер:
7.54 Mб
Скачать

Алгоритм push_heap()

template< class RandomAccessIterator >

void

push_heap( RandomAccessIterator first,

RandomAccessIterator last );

template< class RandomAccessIterator, class Compare >

void

push_heap( RandomAccessIterator first,


RandomAccessIterator last, Compare comp );

push_heap() предполагает, что последовательность, ограниченная диапазоном [first,last-1), – хип и что новый добавляемый к хипу элемент находится в позиции last-1. Все элементы в диапазоне [first,last) реорганизуются в новый хип. Перед вызовом push_heap() необходимо вставить новый элемент в конец контейнера, возможно, применив функцию push_back() (это показано в примере ниже). В первом варианте при сравнении используется оператор “меньше”, определенный для типа элементов контейнера; во втором – операция comp.

Алгоритм 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";


}

A

abort(), функция

вызов из terminate() как подразумеваемое поведение 423

abs(), функция

поддержка для комплексных чисел 131

accumulate(), обобщенный алгоритм 841

adjacent_difference(), обобщенный алгоритм 842

adjacent_find(), обобщенный алгоритм 843

algorithm, заголовочный файл 455

any(), функция

в классе bitset 140

append(), функция

конкатенация строк 231

argc, переменная

счетчик аргументов в командной строке 283

argv, массив

для доступа к аргументам в командной строке 283

assert(), макрос 47

at(), функция

контроль выхода за границы диапазона во время выполнения 232

atoi(), функция

применение для обработки аргументов в командной строке 286

auto_ptr, шаблон класса 319

подводные камни 319

aункции

интерфейс

включение объявления исключений в 426

B

back_inserter(), адаптор функции

использование в операции вставки push_back() 449

back(), функция

поддержка очереди 253

begin(), функция

итератор

возврат с помощью 449

binary_search(), обобщенный алгоритм 844

bind1st(), адаптор функции 446

bitset, класс

test(), функция 140

to_long(), функция 143

to_string(), функция 142

заголовочный файл bitset 141

оператор доступа к биту ([]) 140

операции 143

break 178

break, инструкция

сравнение с инструкцией return 275

C

C_str(), функция

преобразование объектов класса string в C-строки 116

C, язык

символьные строки

динамическое выделение памяти для 320

необходимость доступа из класса string 110

C++, язык

std, пространство имен 340

введение в (глава) 13

компоненты

типы данных (глава) 118

предопределенные операторы (таблица) 555

catch-обработчик 56, 417, 419

критерий выбора 57

универсальный обработчик 426

cerr 25

представление стандартного вывода для ошибок с помощью 791

char *, указатель

работы с C-строками символов 83

char, тип 69

check_range(), пример функции

как закрытая функция-член 47

cin 25

использование итератора istream_iterator 451

представление стандартного ввода с помощью 791

class, ключевое слово

typename как синоним 377

использование в определении класса 463

использование в определении шаблона класса 610

использование в параметрах-типах шаблона

класса 610

функции 375

const, квалификатор

вопросы разрешения перезагрузки функций

ранжирование преобразований, связанных с инициализацией ссылочных параметров 372

константные объекты, динамическое выделение и освобождение памяти 322

константные параметры

параметры-ссылки с квалификатором const 264, 271

передача массива из константных элементов 268

контейнеры, необходимость константного итератора 448

преобразование объектов в константы 90

сравнение с volatile 109

ссылка, инициализация объектом другого типа 94

указатели на константные объекты 91

copy(), обобщенный алгоритм 844

использование класса inserter 244

count_if(), обобщенный алгоритм 849

count(), обобщенный алгоритм 846

использование istream_iterator и ostream_iterator 452

использование с множествами 245

count(), функция

в классе bitset 140

cout 25

представление стандартного вывода с помощью 791

cпецификации

исключений

для документирования исключений 426

D

delete, оператор 33, 136

безопасное и небезопасное использование, примеры 315

для массивов

объектов класса 573

для одиночного объекта 313

deque (двустороння очередь, дека)

как последовательный контейнер 255

применение для реализации стека 251

do-while, инструкция 178

сравнение с инструкциями for и while 172

E

end(), функция

итератор, использование 211

endl, манипулятор потока iostream 25

equal_range(), обобщенный алгоритм

использование с контейнерами multimap и multiset 249

extern \ 299, 348, 349

extern, ключевое слово

использование с членами пространства имен 332

как директива связывания 282

объявление

константы 308

объявления объектов

без определения 305

размещение в заголовочном файле 306

F

f, суффикс

нотация для литерала с плавающей точкой одинарной точности 70

find_first_of(), обобщенный алгоритм

нахождение знаков препинания 225

нахождение первого символа в строке 221

find_last_ of() 224

find_last_not_of() 224

find(), обобщенный алгоритм

поиск подстроки 220

поиск элемента отображения 238

for, инструкция 174

использование с инструкцией if 163

front_inserter(), адаптор функции

использование в операции push_front() 449

front(), функция

поддержка очереди 253

fstream, класс

файловый ввод / вывод 792

full(), функция

модификация алгоритма динамического роста стека 254

G

getline(), функция 217, 814

goto, инструкция 181

greater_equal, объект-функция 445

greater, объект-функция 445

I

if, инструкция 166

If, инструкция

условный оператор как альтернатива 132

insert(), функция

вставка символов в строку 230

реализация 214

списки 181

inserter, класс 244

inserter(), адаптор функции

для вставки с помощью insert() 449

iostream библиотека

iostream.h, заголовочный файл, пример использования 439

ввод

istream_iterator 451

итераторы 453

манипуляторы

endl 25

операторы, сцепление 25

isalpha(), функция 170

ctype, заголовочный файл 228

isdigit(), функция

ctype, заголовочный файл 228

ispunct(), функция

ctype, заголовочный файл 228

isspace(), функция

ctype, заголовочный файл 228

istream_iterator 452

L

l-значение 74

как возвращаемое значение, подводные камни 277

оператор присваивания, требования 126

преобразования 354

преобразование точного соответствия 353

точное соответствие при разрешении перегрузки функций 361

трансформация 356, 368

less_equal, объект-функция 445

less, объект-функция 445

M

main() 15

map, заголовочный файл

использование с контейнером multimap 248

merge(), обобщенный алгоритм

специализированная версия для спискаов 458

modulus, объект-функция 444

multimap (мультиотображение), контейнер 250

multiplies, объект-функция 444

N

negate, объект-функция 444

new оператор

для константных объектов 323

для объектов классов 569

использование класса распределителя памяти (сноска) 208

not_equal_to, объект-функция

(код) 445

not2(), адаптор функции

как адаптор-отрицатель 446

numeric, заголовочный файл 455

использование численных обобщенных алгоритмов 457

O

ofstream, тип 827

P

pair, класс 109

plus, объект-функция 443, 444

pop_back(), функция

использование для реализации динамического роста стека 254

push_back(), функция

поддержка в контейнерах 209

стеки, использования для динамического выделения памяти 254

push_front(), функция

поддержка в списковых контейнерах 209

R

r-значение 74

использование при вычислении выражений 119

release()б функция

управление объектами с помощью класса auto_ptr 319

reserve(), функция

использование для установки емкости контейнера 207

reset(), функция

установка указателя auto_ptr 318

resize(), функция

использование для изменения размера контейнера 209

return, инструкция

сравнение с выражением throw 415

S

sort(), обобщенный алгоритм

вызов 104

передача объекта=функции в качестве аргумента 443

stack, заголовочный файл 250

static_cast, оператор

опасности 152

string, заголовочный файл 60

string, строковый тип 88

substr(), функция 222

пустая строка 86

смешение объектов типа string и C-строк 87

switch, инструкция 171

использование ключевого слова default 167, 169

T

this, указатель 481

tolower(), функция

преобразование заглавных букв в строчные 228

toupper(), функция

ctype, заголовочный файл 228

locale, заголовочный файл 228

true, ключевое слово 96

typedef

для улучшения читабельности 294

как синоним существующего имени типа 343

массива указателей на функции 294

typename 196

использование с параметрами шаблона функции 377

U

unexpected(), функция

для обработки нераспознанных исключений 426

unique_copy(), обобщенный алгоритм

запись целых чисел из вектора в стандартный вывод 450

unique(), обобщенный алгоритм

удаление дубликатов из вектора 435

using-директивы

влияние на разрешение перегрузки функции 365

using-объявления 336

влияние на разрешение перегрузки функции 364

для объявления перегруженных функций 346

сравнение с using-директивами 339

V

vector, заголовочный файл 63

void

в списке параметров функции 259

void*

преобразование в void* как стандартное преобразование 360

volatile, квалификатор 109

для типа параметра, в связи с перегрузкой функций 343

использование преобразования квалификаторов 370

W

while, инструкция 176

сравнение с инструкциями for и do-while 172

символы

& (амперсанд)

оператор взятия адреса:использование в определении ссылки 93

&& (двойной амперсанд)

оператор логического И 123

шаблон класса Array

Array_RC, производный класс 756

#

#include, директива

использование с using-директивой 61, 339

использование с директивой связывания 281

а

абстракция

объекта, класс комплексных чисел как пример 129

стандартная библиотека, преимущества использования 138

автоматические объекты

объявление с ключевым словом register 311

особенности хранения 310

адапторы

функций, для объектов-функций 446

адрес(а)

как значение указателя 79

конкретизированных шаблонов функций 380

алгоритм(ы)

функция

выведение аргумента шаблона 383

разрешение перегрузки 400

шаблон как 374

аргумент(ы) 257

передача 275

использование указателей для 78

передача по значению 262

по умолчанию

и виртуальные функции 692

и устоявшие функции 372

тип

преобразования, разрешение перегрузки функции 362

преобразования, расширение типа 358

преобразования, ссылок 362

преобразования, стандартные 360

шаблона класса

для параметров-констант 615

для параметров-типов 615

шаблонов функции

явные 386

шаблонов функций

выведение аргументов 384

явная спецификация, мотивировка 386

явная спецификация, недостатки 386

арифметические

исключения 121

объекты-функции 444

операторы 122

таблица 120

операции, поддержка для комплексных чисел 108

преобразования 147, 150

bool в int 96

неявное выполнение при вычислении выражений 147

типов, расширение типа перечисления 98

указатели 81

ассоциативность

операторов, влияние на вычисление выражений 147

порядок вычисления подвыражений 120

ассоциативные контейнеры

неприменимость обобщенных алгоритмов переупорядочения 458

ассоциирование

значений, использование класса pair 109

б

базовые классы

абстрактные базовые классы 689

видимость классов

при виртуальном наследовании 749

видимость членов

при множественном наследовании 739

при одиночном наследовании 737

виртуальные базовые классы 750

деструкторы 682

доступ

к базовым классам 734

к закрытым базовым классам 733

к защищенным членам 661

к членам 674

доступ к элементам отображения с помощью 239

конструирование

виртуальное наследование 748

множественное наследование 722

одиночное наследование 680

почленная инициализация 703

определение базового класса

при виртуальном наследовании 744

при множественном наследовании 725

при одиночном наследовании 666

преобразование к базовому классу 660

при выведении аргументов шаблона функции 382

присваивание, почленное присваивание 705

байты

запись с помощью put() 809

чтение с помощью get() 812

безопасное связывание 306

перегруженных функций 349

бесконечный

рекурсия 279

цикл, избежание в операциях поиска в строке 221

бинарные

операторы 119

битовое поле

как средство экономии памяти 497

битовый вектор 137

в сравнении с классом bitset 137

блок

try-блок 419

инструкций 157

комментария 23

функциональный try-блок

и конструкторы 781

больше (>), оператор

поддержка в арифметических типах данных 28

булевский(е)

стандартные преобразования при разрешении перегрузки функции 358

в

вектор(ы)

find(), обобщенный алгоритм 433

емкость, связь с размером 209

увеличение размера 208

взятия адреса (&) оператор

использование в определении ссылки 93

использование с именем функции 293

взятия индекса оператор ([])

использование в классе bitset 141

использование в отображениях 236

видимость

определения символической константы 308

переменных в условии цикла 173, 304

роль в выборе функции-кандидата при разрешении перегрузки функции 363

требование к встроенным функциям 281, 309

висячий

проблемы висячего else, описание и устранение 163

время жизни 304

auto_ptr, влияние на динамически выделенные объекты 316

динамически выделенных объектов 313

сравнение с указателями на них 315

и область видимости (глава) 340

локальных объектов

автоматических и статических 310

влияние раскрутки стека на объекты типа класса 422

проблема возврата ссылки на локальный объект 277

вставка элементов

в вектор 105

в контейнер, с помощью адапторов функций 449

в контейнеры multimap и multiset 249

в отображение 236

в стек 251

итераторы, обозначение диапазона 449

различные механизмы для разных типов контейнеров 203

встроенные функции 113

объекты-функции 436, 441

объявление 281

шаблонов функций как 377

определение, размещение в заголовочном файле 307

перегруженные операторы вызова 437

преимущества 280

встроенный(е)

массивы

запрет присваивания другому массиву 259

запрет ссылаться на 100

отсутствие поддержки операции erase() 435

типы данных

арифметические 31

выполнение

непоследовательные инструкции 20

условное 19

выражения

(глава) 156

использование аргументов по умолчанию 272

разрешение имен 301

вычисление

порядок вычисления подвыражений 120

вычитание

minus, объект-функция 444

г

глобальное пространство имен

проблема засорения 59, 324

глобальные функции 304

д

данные-члены

изменчивые (mutable) 478

члены базового и производного классов 669

декремента оператор (--)

постфиксная форма 128, 568

префиксная форма 129, 567

деление

комплексных чисел 130

целочисленное 120

деструктор(ы) 528

для элементов массива 530

динамическое выделение памяти

для массива 135

как требование к динамически растущему вектору 205

динамическое освобождение памяти

для массивов 321

объектов 324

одиночных объектов 316

оператор delete 114, 313, 314, 576

утечка памяти 315

директивы 23

директивы связывания 283

в связи с перегрузкой 347

использование с указателями на функции 298

для элементов массива

динамическое выделение памяти 533

доступ

к контейнеру

последовательный доступ как критерий выбора типа 204

к массиву 28

индекс 41

индексирование 98

к пространству имен

механизмы, компромиссные решения 61

к членам 467, 473

оператор доступа к членам -> 566

уровни, protected 45

друзья 560

и специальные права доступа 115, 467

е

емкость контейнерных типов

в сравнении с размером 205

з

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

как средство повторного использования объявлений функций 258

по имени

algorithm 65

iomanip 115

limits 122

memory 316

set 243

sstream 794

stack 250

string 61

vector 63, 104

содержимое

включение определения шаблона функции, преимущества и недостатки 388

директивы связывания 282

объявления 75, 309

объявления явных специализаций шаблонов 394

запись активации 262

автоматическое включение объектов в 310

И

И, оператор 120

и

идентификатор 75

использования в качестве спецификатора типа класса 110

соглашения по именованию 76

иерархии

определение

идентификация членов 669

исключений, в стандартной библиотеке C++ 783

поддержка мезанизма классов 110

именование

соглашения об именовании идентификаторов 76

имя 76

квалифицированные имена

статических членов класса 483

членов вложенных пространств имен 330

шаблонов функций как членов пространства имен 410

параметра шаблона

функции 376

перегруженные операторы 556

переменной 76

разрешение

в области видимости класса 502

инициализация

векторов 104

массива

динамически выделенного 320

динамически выделенных объектов классов 572

многомерного 101

указателей на функции 295

объектов

автоматических 310

автоматических, по сравнению с локальными статическими 312

глобальных, инициализация по умолчанию 305

динамически выделенных 313

статических локальных 311

поведение auto_ptr 317

сравнение с присваиванием 125

ссылок 93

указателя на функцию 293

влияние на спецификацию исключений 428

вопросы, связанные с перегруженными функциями 348

инкремента оператор (++)

встроенный 129

инструкции

break

для выхода из инструкции switch 168

continue 178

do-while 177

for 175

goto 180

if 19, 166

объявления 161

простые 158

инструкция

while 20

использование преобразования квалификаторов 355

использование шаблонов 55

итератор с произвольным доступом 454

итератор(ы) 106

end(), доступ к элементам контейнера 212

iterator, заголовочный файл 450

абстракция, использование а обобщенных алгоритмах для обхода 431

адаптор 434

доступ к подмножеству контейнера с помощью 212

категории 454

двунаправленный итератор 454

итератор записи 453

итератор чтения 453

однонаправленный итератор 454

требования к поведению, выдвигаемые обобщенными алгоритмами 455

к

китайский язык

поддержка двухбайтовых символьных литералов 70

класс(ы)

возвращаемые значения 277

вопросы эффективности 548

друзья 559

заголовок 463

объединение 496

параметры

вопросы эффективности 264

для возврата сразу нескольких значений 278

тело 463

командная строка

класс 291

опции

пример программы 289

комментарии 24

блочные 24

комплексные числа 18, 108

выражения с участием 130

заголовочный файл complex 107

как абстракция класса 28

операции 132

представление 131

типы данных 28

композиция

объектов 735

сравнение с наследованием 732

конкретизация

шаблона функции 378

К

Конкретизация

шаблона функции

разрешение перегрузки 402

к

константы

константные выражения

sizeof() как пример 135

размер массива должен быть 99

литерал 71

подстановка 308

ссылки, рассматриваемые как 93

конструктор(ы)

вызовы виртуальных функций в 700

для базовых классов

почленная инициализация 705

при единичном наследовании 680

для элементов массива

список инициализации массива 530

как коверторы 582

конструкторы по умолчанию 521

копирующие конструкторы 193, 524

почленная инициализация 543

ограничение возможности созданий объектов 521

список инициализации членов 539

контейнерные типы

емкость

связь с размером 210

и итераторы 214

инициализация, с помощью пары итераторов 213

параметры 271, 278

преимущества, автоматическое управление памятью 321

копирование

как операция инициализации 209

массивов 100

строк 87

копирующий

конструктор 39, 112

для динамического увеличения размера вектора 206

л

лексикографическое упорядочение

в обобщенных алгоритмах перестановок 457

в обобщенныых алгоритмах сравнения 457

литеральные константы 71

C-строки

сравнение с символьными литералами 100

f суффикс 70

U суффикс 70

с плавающей точкой 70

логические встроенные операторы 125

логические объекты-функции

logical_and 445

logical_not 445

logical_or 445

локализация

влияние глобального объекта на 278

константной переменной или объекта 90

на уровне файла, использование безымянного пространства имен 333

локальная область видимости 300, 304

try-блок 418

доступ к членам в глобальной области видимости, скрытым за локальными объектами 328

имена в пространстве имен, скрытые за локальными объектами 330

переменная, неинициализированная 310

разрешение имени 302

локальные объекты 312

проблема возврата ссылки на 276

статические 309

м

массив(ы)

в сравнении с векторами 105

динамическое выделение и освобождение

массивов объектов классов 533, 576

индексирование 29, 101

отсутствие контроля выхода за границы диапазона 101

инициализация 29, 100

динамически выделенных массивов объектов класса 533

использование оператора sizeof() 133

как параметры функций 270

для передачи нескольких параметров 278

многомерные 269

преобразование массива в указатель 354

многомерные 102

обход

с помощью манипуляции указателем 102

с помощью пары итераторов 213

объектов класса 535

определение 28, 98

перегруженный оператор

new[] 574

поддержка обобщенными алгоритмами 432

размер, не является частью типа параметра 267

связь с типом указателей 104

указателей на функции 295

меньше, оператор

поддержка в арифметических типах данных 28

требование о поддержке типом элементов контейнера 210

многоточие (...)

использование в типах функций 292

множество (set), контейнерный тип

size() 245

ограничение на изменение порядка 458

определени 244

сравнение с отображением 234

модели компиляции

шаблонов класса

с разделением 634

шаблонов функций 391

с включением 388

с разделением 389

н

наилучшая из устоявших функций 350

неоднозначность

перегруженных

функций, диагносцирование во время разрешения перегрузки 359

указателя, стандартные преобразования 360

шаблона функции

конкретизация, опасность перегрузки 396

неявные преобразования типов 148

о

область видимости

видимость класса

и определение класса 463

объявлений исключений в catch-обработчиках 421

параметра шаблона

функции 377

управляющих переменных в инструкции for 303

область видимости глобального пространства имен 300, 324

обобщенные алгоритмы

алфавитный указатель (приложение) 907

генерирования 457

использование итераторов 454

категории и описания 458

независимость от типа 431, 432

нотация для диапазона элементов 454

обзор 433

пример использования 441

работа с хипом 458

удаления 456

обратная косая черта (

как префикс escape-последовательности 70

обратные итераторы 449

обход

заполнение множества с помощью 243

использование с контейнерами multimap и multiset 248

множества 245

невозможность обхода перечислений 98

обход отображения 242

отображения текста на вектор позиций 240

параллельный обход двух векторов 237

объект(ы)

автоматические 310

использование памяти 74

определение 78

переменные как 74

члены пространства имен 326

объектно-ориентированное программирование

проектирование

(пример) 50

объектное программирование 462

объекты-функции 448

functional, заголовочный файл 443

использование в обобщенных алгоритмах 431

источники 443

логические 445

предопределенные 444

объявление

инструкция 14

объявления

в части инициализации цикла for 173

видимость имени, вводимого объявлением 300

и определение 305

исключения 420

класса bitset

объектов 142

локальность 159

перегруженное

оператора 112

функции 341

пространства имен 325

сопоставление объявлений в разных файлах 306

указателя на функцию 292

включение спецификации исключений в 428

функции 257

задание аргументов по умолчанию 271

размещение в заголовочном файле 307

функции-члена, перегруженное 593

шаблона функции

определение используемых имен 404

связь с определением 403

требования к размещению явных объявлений конкретизации 390

явной конкретизации

шаблона класса 635

оператор \ 123

оператор ввода 25

оператор вывода 795

перегрузка 815

оператор вызова функции 564

операторы

встроенные

sizeof 135

арифметические 122

перегруженные

delete 572

взятия индекса ([]) 562

вопросы проектирования 558

члены и не-члены класса 555

определения 15

typedef 108

исключений, как иерархий классов 773

класса

сравнение с определением класса 468

класса-диспетчера запросов (пример) 712

массива 99

многомерных массивов 101

множеств 245

объекта 305

объектов класса complex 107

последовательных контейнеров 211

производного класса 668

пространств имен 334

членов 332

отображения 248

map, заголовочный файл 234

заполнение 235

невозможность переупорядочения 458

текста

определение 238

отрицатели

как адапторы функций 446

очереди 253

queue, заголовочный файл 252

size() 252

top(), функция 253

очереди с приоритетами 252, 253

очередь с приоритетами 252

size() 252

ошибки

assert(), макрос 184

бесконечная рекурсия 279

в инструкции if 162

в циклах 164

зацикливание 84

висячие указатели 310

как избежать 315

динамического выделения памяти 315

итератор, использование 184

компиляции, конфликты в области видимости using-объявления 346

массив

индекс за концом 84

области видимости, подводные камни using-директивы 339

пропуска

завершающего нуля в C-строке 320

скобок при освобождении динамически выделенного массива 321

смещения на единицу при доступе к массиву 29

фазы связывания при наличии объявления в нескольких файлах 305

О

Ошибки

конкретизации шаблона функции 380

п

память

утечка 33

параметр(ы)

размер, важность для передачи по значению 262

параметры функций

использования многоточия 274

при разрешении перегруженных функций 342

проверка типов 261

списки параметров 260

сравнение параметров указательного и ссылочного типов 267

сравнение с глобальными объектами 279

ссылки 95, 265

использование для возврата нескольких значений 164

на константы 264

преимущества в эффективности 264

указатели 263

указатели на функции 298

переменные

константные 90

перестановки, обобщенные алгоритмы 459

перечисления 98

основания для включения в язык 96

расширение типа при разрешении перегрузки функции 357

по умолчанию

аргументы 273

влияние на выбор устоявших функций 371

побитовый(е)

оператор И (&) 137

оператор И с присваиванием (&=) 128, 137

оператор ИЛИ (!) 138

оператор ИСКЛЮЧАЮЩЕЕ ИЛИ (^) 138

оператор НЕ (~) 137

оператор сдвига (<<,>>) 138

операторы 139

поддержка в классе bitset 143

повторное возбуждение

исключения 424

позиция

разрешение аргумента по позиции в списке 271

поиск

rfind() 224

подстрок 225

элементов

множества 244

отображения текста 239

П

ПОО (правило одного определения) 304

п

последовательные контейнеры

вставка элементов 214

обобщенные алгоритмы 217

определение 208

перестановка элементов 216

присваивание 216

предостережения

использование знакового бита в битовых векторах 139

неопределенность порядка вычисления бинарных операторов сравнения 124

опасности приведения типов 150

подводные камни

возврата ссылки на объект 277

глобальные объекты 278

представление

строк 82

преобразование

бинарного объекта-функции в унарный, использование адаптора-связывателя 446

выбор преобразования между типами классов 592

выведение аргументов шаблона функции 381

как точное соответствие при разрешении перегрузки функции 362

квалификаторов

влияние на последовательность преобразований 369

при выведении аргументов шаблона функции 382

конверторы 352

множественные, разрешение неоднозначности приведения 367

определенное пользователем 352

последовательности

определенных пользователем преобразований 586

определенных пользователем, с учетом наследования 788

стандартных преобразований 371

с потерей точности, предупреждение компилятора 261

стандартное 360

трансформация I-значения

ранжирование при разрешении перегрузки функции 368

указателей

в тип void* и обратно 150

явные преобразования типов 122, 148, 150

препроцессор

комментарий

парный(/**/) 23

константы

__cplusplus__ 22

макросы

шаблоны функций как более безопасная альтернатива 373

предкомпилированные заголовочные файлы 307

приведение(я) 122

const_cast, оператор, опасность применения, 151

dynamic_cast (), оператор 767

dynamic_cast()

идентификация класса объекта во время выполнения 153

reinterpret_cast

опасности 152

reinterpret_cast, оператор 152

static_cast

сравнение с неявными преобразованиями 151

static_cast, оператор 152

выбор конкретизируемого шаблона функции 380

для принудительного установления точного соответствия 356

опасности 152

сравнение нового синтаксиса со старым 152

старый синтаксис 154

применение для подавления оптимизации 109

примеры

класс IntArray 42

IntSortedArray, производный класс 49

класс iStack

поддержка динамического выделения памяти 254

преобразование в шаблон stack 255

класс String 118

обработка аргументов в командной строке 284

функция sort 291

шаблон класса Array

SortedArray, производный класс 760

присваивание

векторам, сравнение с встроенными массивами 105

и поведение auto_ptr 317

комплексных чисел 130

оператор

и требования к l-значению 74

перегруженный 545, 562

составной 127

последовательному контейнеру 216

ссылке 95

указателю на функцию

вопросы, связанные с перегруженностью функции 348

проверка

типа

назначение и опасности приведения типов 152

неявные преобразования 261

объявления, разнесенного по нескольким файлам 306

отмена с помощью многоточия в списке параметров 273

параметра 261

указателя 80

программа 20

производительность

auto_ptr 317

классы, локальность ссылок 160

компиляции

при конкретизации шаблонов функций 390

контейнеров

компромиссы при выборе контейнера 204

сравнение списка и вектора 206

определения шаблона функции в заголовочном файле 388

сравнение обработки исключений и вызовов функций 429

ссылок

параметры и типы возвращаемых значений 310

указателей на функции

проигрыш по сравнению с параметрами-ссылками 421

проигрыш по сравнению со встроенными функциями 436

сравнение с объектами-функциями 442

функций

передачи аргументов по значению 262

производные классы

конструкторы 678

присваивание почленное 703

пространства имен

безымянные

отличие от других пространств имен 333

вложенные

и using-объявления 346

глобальное

проблема загрязнения пространства имен 324

область видимости 300

определения 327

определенные пользователем 325

члены

определения 331

требование правила одного определения 332

шаблоны функций 410

процедурное программирование

(часть 3) 461

псевдоним(ы)

имен типов, typedef 109

пространства имен 59, 335

р

разрешение перегрузки функции 351

(глава) 372

выбор преобразования 585

устоявшие функции 367

для вызовов операторных функций 601

для вызовов функций-членов 596

функции-кандидаты

для вызовов функций-членов 594

явные приведения как указания компилятору 356

Р

Разрешения области видимости оператор (

):доступ к шаблону функции как члену пространства имен 410

р

разыменования оператор (*)

использование с возвращенным типом указателя 292

не требуется для вызова функции 293

опасности, связанные с указателями 266

ранжирование

определений шаблона функции 396

рассказ об Алисе Эмме 202

и реализация класса string 116

С

С, язык

функции

указатели на функции 298

с

символ(ы)

литералы

синтаксис записи 70

массив символов, инициализация 100

нулевой, для завершения строкового литерала 71

символы

(обратная косая черта знак вопроса)

escape-последовательность \ 70

__STDC__ 22

_обратная косая черта одиночная кавычка)

escape-последовательность \ 70

- (минус)

использование для обозначения опций в командной строке 284

-- (двойной минус)

оператор декремента 128

-= (минус равно)

оператор вычитания с присваиванием 128

-> (минус правая угловая скобка)

оператор \ 566

, (запятая)

неправильное применение для индексации массива 102

оператор 136

; (точка с запятой)

для завершения инструкций 157

: (двойное двоеточие):оператор разрешения области видимости 329

: (двойное двоеточие):оператор разрешения области видимости класса 39

! (восклицательный знак)

оператор \ 123, 124

?\

(знак вопроса двоеточие):условный оператор 113, 132

(знак вопроса двоеточие):условный оператор:сокращенная запись if-else 165

. (точка)

оператор \ 35

... (многоточие) 274

для обозначения универсального catch-обработчика 424

() (круглые скобки)

использование оператора вызова для передачи объекта-функции 442

(обратная косая черта a)

escape-последовательность \ 70

(обратная косая черта n)

escape-последовательность \ 70

(обратная косая черта v)

escape-последовательность \ 70

(обратная косая черта)

как escape-символ 225

[,) (левая квадрнатная, правая круглая скобки)

для обозначения интервала с включенной левой границей 454

[] (квадратные скобки)

для освобождения выделенной под массив памяти 321

оператор взятия индекса 563

оператор взятия индекса:для доступа к вектору 104

оператор взятия индекса:для проверки битов в битовом векторе 141

оператор взятия индекса:не поддерживается для контейнеров multiset и multimap 250

оператор индексирования массива, перегрузка в определении класса массива 41

{} (фигурные скобки)

использование в объявлениях пространств имен 326

использование в предложении catch 418

использование в составной директиве связывания 282

как ограничители составной инструкции 157

при инициализации вложенного массива 101

* (звездочка)

оператор разыменования:доступ к объектам с помощью 80

оператор разыменования:использование для задания типа возвращаемого значения 292

оператор разыменования:как унарный оператор 119

оператор разыменования:определение указателей с помощью 79

оператор разыменования:приоритет 103

оператор умножения:характеристики и синтаксис 120

*= (звездочка равно)

оператор умножения с присваиванием 128

/ (косая черта)

оператор деления:характеристики и синтаксис 120

/= (косая черта равно)

оператор деления с присваиванием 128

\\ (двойная обратная косая черта)

escape-последовательность \ 70

\\ \ 70

\\t (обратная косая черта t)

escape-последовательность горизонтальнаятабуляция 70

& (амперсанд)

оператор взятия адреса:использование с именем функции 137

оператор взятия адреса:как унарный оператор 119

&& (двойной амперсанд)

оператор логического И 120

&= (амперсанд равно)

оператор побитового И с присваиванием:как оператор составного присваивания 127

% (процент)

оператор вычисления остатка, характеристики и синтаксис 121

%= (процент равно)

оператор вычисления остатка с присваиванием 128

^ (крышка)

оператор побитового ИСКЛЮЧАЮЩЕГО ИЛИ 137

^= (крышка равно)

оператор побитового ИСКЛЮЧАЮЩЕГО ИЛИ с присваиванием 137

+ (плюс)

оператор сложения:поддержка в арифметических типах данных 28

++ (двойной плюс)

оператор инкремента 128, 569

+= (плюс равно)

оператор сложения с присваиванием 123

< (левая угловая скобка)

оператор \ 210, 436, 441

<< (двойная левая угловая скобка)

оператор вывода 25

оператор сдвига влево 137

<<=(двойная левая угловая скобка равно)

оператор левого сдвига с присваиванием 128

<> (угловые скобки)

явный шаблон:применение в специализациях 391

явный шаблон:спецификации аргументов 384

= (равно)

оператор присваивания 90

оператор присваивания:и l-значение 74

оператор присваивания:использование с объектами классов 36

оператор присваивания:использование с псевдонимами пространств имен 334

== (двойное равно)

оператор равенства:поддержка в арифметических типах данных 28

>> (двойная правая угловая скобка)

оператор ввода 809

оператор ввода:перегрузка 820

оператор сдвига вправо 137

>>=(двойная правая угловая скобка равно)

оператор правого сдвига с присваиванием 128

| (вертикальная черта)

оператор побитового ИЛИ 137

|= (вертикальная черта равно)

оператор побитового ИЛИ с присваиванием 137

оператор побитового ИЛИ с присваиванием:как оператор составного присваивания 128

|| (двойная вертикальная черта)

оператор логического ИЛИ:характеристики и синтаксис 123

оператор логического ИЛИ:вычисление 123

сложения (+) оператор

комплексных чисел 130

сокрытие информации 36, 466

вопросы, связанные с вложенными пространствами имен 330

доступ к

закрытым членам класса 472

имена в локальной области видимости 302

объявление члена пространства имен, обход с помощью оператора разрешения области видимости 328

параметры шаблона, имена в глобальной области видимости 376

сравнение с перегрузкой 345

во вложенных областях видимости 364

члены глобальной области видимости, доступ с помощью оператора разрешения области видимости 328

составные

выражения 120

присваивания

операторы над комплексными числами 130

состояния условий

в применении к библиотеке iostream 829

списки

merge(), обобщенный алгоритм

специализированная реализация для списка 459

size() 180

как последовательный контейнер 211

обобщенные 199

поддержка операций merge() и sort() 217

сравнение с векторами 204

требования к вставке и доступу 204

сравнения

объекты-функции 445

операторы

поддержка в контейнерах 210

ссылки

для объявления исключения в catch-обработчике 424

инициализация

ссылки на const 95

как тип возвращаемого значения функции 276

сравнение с указателями 93

статические объекты

объявление, сравнение с безымянным пространством имен 333

статические члены класса

указатели на 492

статическое выделение памяти 31

стек, контейнерный тип 252

stack, заголовочный файл 250

top(), функция 129, 250

операции (таблица) 250

стека, пример класса 156

строки

append() 231

assign() 231

compare() 232

erase() 215, 230

insert() 215

replace() 233

swap() 216, 231

поиск подстроки 225, 230, 232

т

тело

функции 257

тип

точное соответствие 356

тип(ы)

bool 96

C-строка 85

typedef, синоним типа 108

арифметические 31

для определения нескольких объектов одного и того же типа pair 109

имя класса как 464

использование с директивой препроцессора include 61

точка конкретизации

шаблона функции 406

у

угловые скобки (<>)

шаблон

использование для определения 50

явные

специализации шаблона 391

спецификации аргументов шаблона 384

указатели 81

sizeof(), использование с 134

void* 80

адресация

C-строк 83

объектов 80

объектов класса, использование оператора -> 470

вектор указателей, преимущества 207

висячий

возвращенное значение, указывающее на автоматический объект 310

указывающий на освобожденную память 315

использование в обобщенных алгоритмах 104

как значение, возвращаемое функцией 295

как итераторы для встроенного массива 213

нулевой указатель 360

как операнд оператора delete 315

параметры 263, 266

сравнение со ссылками 40, 94

указатели на функции 299

вызов по 294

и спецификации исключений 429

инициализация 293

на перегруженные функции 348

написанные на других языках 298

присваивание 293

сравнение с указателями на данные (сноска) 79

указатели на члены 493

указатели на данные-члены 490

указатели на функции-члены 489

умножения оператор (*)

поддержка в арифметических типах данных 28

унарные операторы 119

условный

директивы препроцессора 20

инструкция

switch 172

оператор (?

):сравнение с функциями 280

условный оператор

инструкция 157

ф

файл(ы)

ввод/вывод 27

входной

открытие 26

выходной

открытие 27

несколько

размещение определения пространства имен в 327

сопоставление объявлений в 306

функции

возвращаемые значения

локальный объект, проблема возвращения ссылки на 277

объект класса как средство вернуть несколько значений 279

параметр-ссылка как средство возврата дополнительного значения 263

указатель на функцию 297

вызовы

заключенные в try-блок 418

недостатки 280

сравнение с обработкой исключений 423

и локальная область видимости 302

имя функции

преобразуется в указатель 292

интерфейс

объявление функции как 258

прототип функции как описание 258

локальное хранение 262

на другом языке, директивы связывания 281

обращение к 257

объявления

как члена пространства имен 325

объявления перегруженных функций 343

и область видимости 347

когда не надо перегружать 345

причины для перегрузки функций 341

определение 256

как часть шаблона функции 375

сравнение с объявлениями 304

преобразование функции в указатель 355

рекурсивные 280

сигнатура 260

тип

недопустимость возврата из функции 259

преобразование в указатель на функцию 276

тип возвращаемого значения 259

недопустимость указания для конструкторов 516

недостаточен для разрешения перегруженных функций 342

функции-кандидаты 350, 366

вызов с аргументами типа класса 587

для вызовов в области видимости класса 589

для перегруженных операторов 600

для шаблонов функций, 398

наследование и 787

функции-члены 110, 466, 477

вызов 112

модификация для обработки исключений 415

независимые от типа 46

определение 113

открытые

доступ к закрытым членам с помощью 37

перегруженные

проблемы 345

функции-кандидаты 593

статические 486

х

хип 135, 313

выделение памяти для массива в 319

выделение памяти для объекта в 313

исключение bad_alloc 314

обобщенные алгоритмы 904

См. также обобщенные алгоритмы 905

ц

целые

расширение типа 149

стандартные преобразования 149

при разрешении перегрузки функции 358

типы данных 68

цикл(ы) 20

инструкции

while 176

завершение

break, инструкция 178

инструкции

for 174

while 20

ошибки программирования 164

условие останова 30

ч

числа с плавающей точкой

арифметика, характеристики и смежные темы 122

правила преобразования типов 149

стандартные преобразования при разрешении перегрузки функции 358

численные обобщенные алгоритмы 457

читабельность

typedef 108

в объявлениях указателей на функции 294

как синоним контейнерных типпов 236

имен параметров 260

имен перегруженных функций 343

квалификатор const для объявления констант 90

параметров-ссыслок 267

разделение обработчиков исключений 417

рекурсивных функций 279

члены класса

this

использование в перегруженном операторе присваивания 544

когда использовать в функциях-членах 482

указатель this 481

битовые поля 497

данные-члены 465

изменчивые (mutable) 478

статические 485

тип члена 491

функции-члены

встроенные и не-встроенные 472

закрытые и открытые 475

конверторы 581

специальные функции-члены 475

спецификации исключений для 780

статические 486

тип члена 490

шаблоны 630

ш

шаблоны классов

(глава) 649

вложенные типы 627

и пространства имен 644

модели компиляции 636

с включением 632

с разделением 635

объявления друзей в 623

определения 609

разрешение имен в 643

параметры 608

параметры-типы 613

статические члены классов 625

точка конкретизации, для функций-членов 643

частичные специализации 640

члены

функций 618

явные

специализации 639

шаблоны функций

(глава) 413

и пространства имен 410

конкретизации 380

определение 378

параметры

для повышения гибкости обобщенных алгоритмом 441

параметры-константы 375

параметры-типы 375

перегрузка 397

передача объектов-функций шаблону 443

разрешение имен в определениях 407

разрешение перегрузки при конкретизации 402

тип возвращаемого значения и выведение аргументов шаблона 385

явные

спецаиализации 395

э

эффективность

сравнение с гибкостью при выделении памяти 31

я

явное

преобразование 153

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 Напомним, что для упрощения реализации необходимо, чтобы между любыми двумя словами, включая скобки и операторы запроса, был пробел. В реальной системе такое требование вряд ли разумно, но мы полагаем, что для вводного курсе, каковым является наша книга, это вполне приемлемо.

3 Увы! Правые скобки не распознаются, пока OrQuery не выведет все ассоциированное с ним частичное решение.

19 Полный текст программы можно найти на FTP-сайте издательства Addison-Wesley по адресу, указанному на задней стороне обложки.

1 Здесь есть потенциальная опасность появления висячей ссылки, если пользователь сохранит адрес какого-либо элемента исходного массива перед тем, как grow() скопирует массив в новую область памяти. См. статью Тома Каргилла в [LIPPMAN96b].

1 Кроме того, программист может устанавливать и сбрасывать флаги состояния формата с помощью функций-членов setf() и unsetf(). Мы их рассматривать не будем; исчерпывающие ответы на вопросы, относящиеся к этой теме, можно получить в [STROUSTRUP97].