Бьерн Страуструп. Язык программирования С++. Специальное издание (2011) (1004033), страница 241
Текст из файла (страница 241)
Удостоверьтесь, что объекты сравнения ассоциативных контейнеров можно копировать; эЕ.З.З. Выделяйте наиболее важные структуры данных и предоставляйте сильную га- рантию для их операций; эЕ.6. (*2.5) Реализуйте Яг(лл из В11.12 так, чтобы он стал столь же безопасным, как стандартный контейнер. (*2) Сравните производительность различных версий присваивания лля гесюг и за~е лаз(8л () (вЕ.З.З).
(*1.5) Скопируйте аллокатор без использования операции присваивания (как это требуется лля улучшения овегагог= () в ЭЕ.З.З). Е.8. Упражнения 1115 10 11 12 13 14 15 16 17 18 19 20 21 22 ('2) Добавьте к типу гесюог одноэлементные и многоэлементные операции егазе() и !июегю(), предоставляющие базовую гарантию (0Е.3.2). (*2) Добавьте к типу гесюог одноэлементные и многоэлементные операции егазе() и !изегю(), предоставляющие сильную гарантию (0Е.3.2).
Сравните стоимость и сложность данного решения с решением из упражнения 10. (*2) Напишите за!е !изегю() (0Е.4.2), которая вставляет элементы в существующий гесюог (а не копирует во временную переменную). Какие ограничения придется наложить на операции? (*2) Напишите за!е !июегю() (5Е.4.2), которая вставляет элементы в существующий июа(ю (а не копирует во временную переменную).
Какие ограничения придется наложить на операции? (*2.5) Сравните размер, сложность и производительность за!е имегю() из упражнений 12 и 13 с версией за~е !изегю() из 0Е.4.2. (*2.5) Напишите усовершенствованный вариант аа!е !изегю() исключительно для ассоциативных контейнеров.
Используйте юга!юю для написания юю(уе !изегю(), который автоматически выбирает оптимальный вариант для контейнера. Подсказка: 019.2.3. (*2.5) Попробуйте переписать ии!и!иа!!юею! ?ю!!() (019.4.4, 0Е.З.!) так, чтобы он справлялся с деструкторами, генерирующими исключения. Возможно ли это? Если да, то какова стоимость такого решения? Если нет, то почему? (*2.5) Попробуйте переписать ии!и!йа!!сею! /И() (019.4.4, 0Е.3.1) так, чтобы он справлялся с итераторами, которые генерируют исключения в операциях — и ю-~.
Возможно ли это? Если да, то какова стоимость такого решения? Если нет, то почему? (*3) Выберите контейнер из библиотеки, отличной от стандартной. Ознакомьтесь с документацией и вьисните, какие гарантии безопасности исключений он предоставляет. Испытайте этот контейнер, чтобы выяснить, насколько он устойчив к исключениям, генерируемым при вьщелении памяти, а также кодом, предоставляемым пользователем. Сравните с соответствующим контейнером стандартной библиотеки. ("3) Попробуйте оптимизировать гесюог из 0Е.З, пренебрегая возможностью исключений. Например, устраните все югу-блоки. Сравните производительность с версией из 0Е.З и с реализацией гесюог из стандартной библиотеки.
Сравните также размер и сложность кода этих вариантов типа гесюог. ('1) Определите инварианты для гесюог (0Е.З) с возможностью ~=0 и без таковой (фЕ.3.5). (*2.5) Прочитайте исходный код реализации хес(ог. Какие гарантии обеспечены для присваивания, многоэлементных ймегю() и гею!ее О? (*3) Напишите версию йазй и)ар (517.6), которая столь же безопасна, что и стандартный контейнер. 1122 Язык программирования С++ 0 оЬ)есс ЫегагсЫек, 868 ос|а!, 118 — пшпЬег, 964 орегасог, 927 — [[ (!с), 559 — гипс!!оп, 329 — печч Ц (), 180 — — О, 180 — =(х), 558 ог, 927 — ес(, 927 огс ЬеарО, 648 оксгеат, 522, 720, 747, 729, 757, 760 — Ьегасог, 102, 665 окспп8ксгеат, 755 от ос гап8е, 467 очегОосч еггог, 467 очег1оайп8, 201 осчпегкЬ[р кетапбск, 448 Р-О ра!г<сопкс Кеу,Т>, 58! рагатеспс ро!упюгрЫяп, 424 рап1а1 крее!а1!гас!оп, 418 — копО, 611 — когс соруО, 611 — яппО, 801 рапЫопО, 611 рапегпк, 833 репписасюпк, 650 р1асе|пепс певуч, 320 р1ик, 619 ро!пс ор шксапс|асюп, 409 ро!псег со тетЬег, 507 — со Ь|пагу О|пес|оп, 621 — со ипагу гипс!!оп, 621 ро!упюгрЫс суре, 75, 383 ро!упюгрЬ!яп, 383 рорО, 65-66, 572 — Ьас!|О, 542, 548, 557 — (гоп|О, 557, 573 — ЬеарО, 612, 648 роя|!че я8пО, !041 рок!Ох, 125 росчО, 108 ргесес)е псе, ! 71 ргесотрО!п8, 258 рге(Ь|, 125 ргеч рептипайопО, 612, 650 рпопсу ссиеие, 559, 565, 574 рпчасе, 72, 927 рготосюпк, 968 ргосессес), 927 рсг гипО, 621 риЬипЬиеО, 759 — (1ос), 763 риЫ!с, 926 рикЫ), 65-66, 573 — Ьас)сО, 542, 548, 557, 572-573 — (гоп!О, 557 — ЬеарО, 612, 648 яиекйоп тагЕ, 964 циеие, 520, 556, 559, 565, 572 К гапс!от к1шйеО, 610 --ассекк Ьегасогк, 612 гап8е, 613 гасч тетогу, 181, 501, 676 гЬе8!пО, 557 геас(О, 732 геа11осО, 50 геси|яче с(ексепс, 156 гесегепсе, 144, 556 — соипс, 362 ге8!яег, 926 ге!псегргес сакс, 601, 926 гепючеО, 6! О ге|поче соруО, 6!Π— сору !СО, 610 — !ГО, 610 гепс!О, 557 гер!асеО, 106, 610, 707 — сору(()), 610 — сору Щ), 610 — !|О, 610 гергекепсас!оп, 914 — с!акк, 363 — суре, 352 герсасе 1(О, 106 — О, 558, 565 — (гек аг8), 709 гексхе(), 558, 599 геко1ийоп и|!ек, 202 гетгп, 926 гечегкеО, 610 — соруО, 6!Π— 1|егасог, 556, 663 п8Ь|-аккос!ас!че, 17! го|все О, 610 — соруО, 610 1124 гуре йе!д, 78 !уремией 256, 926 гуреЫ, 926 гуре(пТо, 467, 522 сурепаше, 926 зчсгуре.Ь, 7!3 иЬ$1е, 927 зчЫепО, 1065 хог, 927 — ег$, 927 ' агрегат, !49 цйояО, 761 влагу йгпсг)оп, 620 — пейаге, 62! ппг(егйоччО, 761 оп(сог)е, 56, 692 цшоп,!51, 926, 977 цп)г)пеО, 6!0 — соруО, 106, 610 Ю1Х, 56 пппашег$ пашеарасе, 232 цпзегГ(юа Ьаае;яЫрзчз), 746 цпз$8пег$, 1! 8,926 — сЬаг, 7!2 — $пг, 118 црсая, 495 црег Ьоцпг)(О), 61! цррег ЬоцпйО, 587 — Ьоцпг)()г), 559 цаег арес(а1$ааг(опя 417 — -оейпег) зрес)а1(аагюпя 417 — -г)ейпег$ гурея 71 цяп8, 926 — -г(ес!ага!(оп, 224 — -йгесйче, 226 --объявление, 477 ц$1!$$у, 520 Ч вЂ” Чг-Х ча!аггау, 107, 136, 523, 555, 559 ча!Ы $гегагог, 656 ча!це сошр(), 559, 582 — гуре, 556 — !урез, 303 че.бев(пО, 98 че.епдО, 98 чесгог, 50, 85, 97, 136, 520, 556, 559, 565 чегг!са1 гаЬ, 964 чгша!, 75, 125, 926 — Ьаае с!аяч 481 чоЫ, 1!4, 926 — *, 50 чо!ай!е, 927 чЫ, 77 гчсЬаг.Ь, 7!О юсйаг $, 927 Язык программирования С++ абстрактные классы, 80, 384-385, 390 — типы, 74, 895, 900-901 — — данных, 7! абстрактный узловой класс, 905 абстракция данных, 59, 69, 71, 73, 75, 77 автоматическая сборка мусора, 308 автоматический объект, 129 агрегация, 867 — и наследование, 869 адаптер г)цеце, 572 — згас)г, 571 адаптеры, 565, 620 — последовательных контейнеров, 570-571, 573, 575 алгоритм ассшпц1агеО, 801 — айасепг й1ТегепсеО, 803 — Ь1пагу зеагсЬО, 645 — соцпгО, 100, 629, 658 — соцпг 1(О, 105, 629 — ег)ца!(), 630 — ййО, 640 — йпг)О, ! 00,104 — йпг$ епг)О, 632 — йпг$ $(О, 105 — гог еасЬ, 103 — Тот еасЬО, 626, 635 — 8епегагеО, 640 — 1пс1цг)езО, 647 — $ппег ргодцсгО, 802 — !гег зчгарО, 642 — !ех!сойгар)йса1 сошрагеО, 649 — шегбеО, 645 — ш)япагсЬО, 617, 630 — рагг!а! яппО, 803 — рап(гюпО, 646 — гешочеО, 640 — гегпоче сору Щ), 640 — гечегаеО, 641 — гогагеО, 64! — гогаге сору(), 641 — зеагсЬО, 631 — зеагсЬ пО, 632 — зег й(ТегепсеО, 647 — аег зупнпегпс ййегепсеО, 647 Предметный указатель 1125 алгоритм ЗтаЫе рап(тюпЦ, 646 — зт«арО, 642 — зттар гапйезО, 642 — тгапзТоппО, 634 — ппк)пеО, 636 — ип!г)ое сорум, 636 алгоритмы, 59, 98-99, 101, 103, 105, 1109 — рагца! зоп(), 643 — замены элементов, 638 — поиска, 627 — семейства рап!т!оп, 646 — стандартной библиотеки, 608-609, 611 — стандартной библиотеки, 106 — улаления элементов, 640 — функциональный объектов, 607-652 аллокаторы, 655-686 алътернатива «агрегация/наследование», 873 — «включение/наследование», 871 анонимные пространства имен, 257 аргументы командной строки, 167 — по умолчанию, 206 — функциональных шаблонов, 410 арифметика указателей, 50 арифметическая операция -, 62 — — %, 62 — — ", 62 — — /, 62 — — +, 62 арифметические операции, 62-63 — типы, 114 ассоциативные контейнеры, 555, 576-587 — массивы, 45 ассоциативный контейнер ви1гппар, 587 — — пш!йзет, 588 — — зет, 588 — массив, 97, 355, 576 — — вар, 576 Б базовый алгоритм зопО, 643 — класс, 373 — — Ьаз!с !оз, 721, 726 базы данных определений типов, 42 беззнаковые целые типы, 118 беззнаковый интегральный тип з!ге т, 172 безопасности в контексте исключений, 1078 бесконечный цикл, 158, 188 библиотека В1.А8, 786 библиотечная функция сига, 165 — — рппт(О, 90 — — геа11осО, 99 — — згг!епО, 139 библиотечные предикаты, 618 библиотечный класс вар, 169 — — озггеав, 169 — — з!пп8, 169 — тип рггг!10' т, 658 бинарная операция, 171, 330 бинарные предикаты, 617 бинарный поиск, 644 — предикат, 612 битовые поля, 976 — — Ьйаец 589 блок сагсЬ, 437 — спецификации компоновки, 263 буфера потоков, 666 В ввод дат и времени, 1052 — и вывод дат и времени, 1046 — — финансовой информации, 1039 вектор, 45, 97 векторы, 971 виртуальные базовые классы, 480 — конструкторы, 396, 511 виртуальные функции, 59, 77, 381 виртуальный базовый класс, 481 вложенные пространства имен, 984 вложенный класс, 347,362 внешняя компоновка, 255 внутренняя компоновка, 256 возвращаемое значение, 200 восстановление типа исключения, 461 временные объекты, 318 вспомогательные функции, 533, 550 встроенные типы, 62, 114 встроенный тип, 42, 87 входные диапазоны, 614 — итераторы, 102 вывод денежных величин, 1043 выделение памяти под массивы, 511 вызов тлк!еп(с), 1065 выражение, 62 выражения, 169, 930 — и операторы, 155-194 вычитание указателей, 140 Г-Д гарантии операций контейнеров, 1101 генерация исключений, 95 гибридное проектирование, 843 глобальная переменная еппо, 434 графический сервер Х-бузгев, 48 1126 Язык программирования С++ двойная наклонная черта, 62 двойные кавычки, 136 двунаправленный итератор, 565, 612 двусвязный список, 97, 565 двусторонняя очередь, 97, 570 действительный итератор, 656 декларатор, 125, 128 — *сонм, 143 деклараторы, 938 декремент, 175, 360-361 делегирования, 875 дескриптор, 352, 363, 914 дескрипторные классы, 895, 914-915, 9!7 деструктор, 73-74, 305, 982 диапазоны, 613 диграфы, 690 динамическая память, 74, 684, 979 директива №епг!!Г, 215 — №!Ие1; 216 — №!пс!иг!е стай, 259 — ехгегп "С", 262-263 — компилятора №1ЯеГ Ыепг!Еег, 215 директивы №!пс!оде, 254, 257 — — препроцессора, 166 — из!пй, 204, 226 — препроцессора, 944-945 — условной компиляции, 274 доступ к базовым классам, 491, 986 — к членам класса, 985 — к элементам массивов, 139 — ко вложенным классам, 988 дружественный класс, 348 друзья, 991 — класса, 346-347, 349 Е-Ж-3 единица трансляции, 254, 930 жирный интерфейс, 529, 890-891 зависимости внутри иерархии классов, 865 — типа "!я-а", 870 заголовочные файлы, 166, 954 — — стандартной библиотеки, 259 заголовочный файл, 67 — — а18оп1Ьт, 609 — — аззеп.Ь, 879 — — сазяеп, 879 — — ссгуре, 712, 734 — — с11ппвк 778 — — с1оса!е, 766 — — сгпай, 778, 779 — — сзггЫеГ, 172, 658 — — сзг011Ь, 650, 7! 1 — — с!уре.Ь, 712 — — Гз!геат, 752 — — йпсг!опа!, 609, 616, 618 — — юзггеат, 87, 734 ~ — — 1зггеат, 726 — — !пшвьЬ, 778 — — 1пп!ы, 776 — — 1!зг, 98 — — 1оса!е, 765, 1О! 1, 1026 — — !оса1е.Ь, 766 — — тар, 98 — — тай.Ь, 778-779 — — тепюгу, 674 — — печч, 180, 320, 684 — — пшпепс, 612, 800 — — Овеете, 572 — — ззггеат, 168 — — зЫ1гЬ.Ь, 650, 711 — — зггеатЬШ, 756 — — з1пп8, 692, 709 — — шй!гу, 578 — — ча!аггау, 780 — — чесгог, 98 загрузчик, 254 закрытие потоков, 753 замаскированные указатели, 980 замещение функций виртуальных базовых классов, 486 защита от повторных включений, 274 защищенные члены классов, 489 знак *, 134 — =, 63 — ==, 63 — », 90 знаковые и беззнаковые символы, 966 знаковый интегральный тип ргп!!й' г, 172 значение Е!30М, 779 — ЕКА!ч!ОЕ, 779 — !гпе, 105 И идентификатор, 113, 126 иерархии классов, 80, 378, 473-514, 862 иерархия объектов, 868 имена, 126 именованные фасеты сравнения, !032 имя, 62, 113, 126 инвариант, 877 инварианты, 877 инициализатор, 125 инициализаторы в операторах Гог, 958 — членов класса, 311 инициализация, 129 Предметный указатель 1127 инициализация массивов, 135 — ссылок, 145 инициализирующие выражение, 128 инкапсуляция, 883 инкремент, 175, 360-361 интегральное продвижение, 968 интегральные типы, 114 интеллектуальные указатели, 358 интернационализация, 1008 интерфейс, 75-76 интерфейсные классы, 909, 911, 913 — функции, 7! интерфейсы, 895 — и реализации, 888 информация о типе объекта на этапе выполнения программы, 494 исключение, 69 — Ьаг! а!!ос, 180-181, 685 — Ьаг! гуре!г1, 501 — !епйгЬ епог, 709 — ош оГ гапке, 695, 697, 708 — вгб::Ьад а!1ос, 675 исключения, 219-252, 735, 1077-1114 — Ьаг! а11ос, 469 — в деструкторах, 455 — в конструкторах, 452 исключительные ситуации, 68 исходный файл, 253-278, 930 итератор 1вггеагпЬпг" Вега!от, 666 — овггеагпЬпр Вега!от, 666 — ввода, 612 — вывода, 612 — произвольного доступа, 612 итераторы, 82-83, 535, 557, 577, 655-686, 694 — для вставок, 662 — и последовательности, 656-667 — произвольного доступа, 612 — типа сопвг йегагог, 96 — — !гегагог, 96 каркас приложения, 918 категории итераторов, 660 квалификатор, 66 квалифицированные имена, 223 класс айосагог, 680 — Ьаяс Вггеагп, 752 — — юв, 765 — — !вггеат, 726, 762 — — 1ввппйвггеаш, 755 — — оягеат, 726, 752, 762 — — вггеагпЬпГ, 760, 762 , — — втпп8, 702 — согпр1ех, 107 — г!аге, 1049 — гасе!, 766, !008, !020 — 8в11се, 796 — !гвггеат, 752 — гягвггеат, 756 — !оса!е, 766, 1008 — 1оса1е, 764-765, 10! 1-1019 — овггеат, 722 — оягягеат, 756 — гечегве 1гегагог, 664 — вгпп8, 89, 362 — ча1апау, 780 — прелставления, 363 — сотр1ех, 72 классификация символов, 712, 1063 классовая иерархия, 79, 378, 473 классовый шаблон апго ргг, 447 класс-представление, 352 классы, 114, 284-295, 860-883, 940-941 — для математических вычислений, 775-806 — функциональных объектов, 607-652 ключ, 576 ключевое слово сагсЬ, 242 — — сопя, 141, 290 — — ехр!!с!г, 353 — — ехрогГ, 429 — — ехгегп, 255, 266 — — пппаЫе, 294 — — орегаюг, 329 — — рготесгед, 376 — — яаг!с, 257 — — вггпсГ, 151 — — гетр!аге, 995 — — йпв, 292 — — гЬготч, 242 — — ггу, 243 — — гурег!еГ, 130 — — гурепагпе, 993 — — чоЫ, 62, 200-20! ключевые слова, 125, 151, 926 — — языка Сн-+, 126 код, ориентированный на выражения, 176 кодировка ЕВС131С, 1! б — 13п!сог!е, ! 17, 690, 1067 кодировки АВС11, 116 1328 Язык программирования С++ комитет ХЗ316, 46 комментарии, 62, 78, 190-191 комплексные числа, 107 композитные исключения, 440 композиция пространств имен, 235 компоненты, 884-885, 887, 889, 891 компоновка, 254-263, 930 компоновщик, 254 конкатенация, 88, 704 конкретизация, 995 — шаблона, 406 — шаблона функции, 1003 конкретные типы, 73, 74, 301, 303, 895 конкретный тип, 78 — узловой класс, 905 константные выражения, 967 — ссылки, 319 — функции-члены, 290 константный объект, 141, 294 — указатель, 144 константы, 141, 143 конструирование новых обьектов локализации, 1015 конструктор, 72-74 конструкторы, 182, 287, 538, 581, 590, 695 — и деструкторы, 376 — и инварианты, 1093 — и преобразования типов, 339 — класса ча)аггау, 780 — по умолчанию, 306 контейнер, 890 — бег(ие, 570 — ЬазЬ шар, 594 — 1Вг, 95 — шар, 96, 556 — чесгог, 93 — типа чесьэг, 533-549 контейнерные классы, 82, 379 контейнерный адаптер, 571 контейнеры, 59, 81, 82, 92-93, 95, 97 — Ьйаец 743 — 8Т1., 531 — с общим базовым классом, 527 контекст с!азз!сО, 1018 — 81оЬа1(), 1018 контроль границ массива, 141 конфликт имен, 231 концепции делегирования, 360 — последовательностей, 83 — сокрытия информации, 66 копирование объектов, 308 — по фактической записи, 365 копирующие алгоритмы, 632 копирующий конструктор, 290, 309, 339, 343, 540, 697 короткие синонимы, 130 косвенное обращение, 134, 360 критерии разрешения перегрузки, 202 куча, 74, 178, 648, 979 кэширование, 293 леводопустимые выражения, 130 лексические соглашения, 927, 929 ленивые вычисления, 295 листовой класс, 905 литералы с плавающей запятой, 119 логическая операция !, 175 — — Й8г, 175 — — !), 175 логические операции, 186 логический тип, 115 логическое «И», 173 — «ИЛИ», 173 — (а!зе, 185 — постоянство, 292 локализация, 764-765, 1007-1076 локальные объекты, 307 — переменные, 197 — статические объекты, 315 макроконстанта Ь!()Е1., 134 макроопределения, 944 макрос ср!пар!из, 263 — аг8 Пчо, 216 — аззепО, 879 — РВЕ М11Ч ЕХР, 778 — Н.Т КАР1Х, 778 — Е()В1.