Главная » Просмотр файлов » Бьерн Страуструп. Язык программирования С++. Специальное издание (2011)

Бьерн Страуструп. Язык программирования С++. Специальное издание (2011) (1004033), страница 114

Файл №1004033 Бьерн Страуструп. Язык программирования С++. Специальное издание (2011) (Бьерн Страуструп. Язык программирования С++. Специальное издание (2011)) 114 страницаБьерн Страуструп. Язык программирования С++. Специальное издание (2011) (1004033) страница 1142018-10-07СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

Текст из файла (страница 114)

Контейнер типа пес(ог 949 иесгог<)пг> гтр = ю и. вюар (апр); У копирование и с умолчателькой емкостью У теперь и получает умолчательпую емкость (см. 3! б.3.9) Р а память под ее предыдущую емкост~ освободится, УУ когда гтр выйдет из области видимости Вектор получает необходимую для его элементов память с помощью вызова функций-членов его аллокатора (который предоставляется в виде шаблонного параметра).

Аллокатор по умолчанию, называемый аНосагог (919.4.1), использует для выделения памяти операцию пею, так что если свободной памяти больше не останется, будет сгенерировано исключение Ьаьг' а((ос. Другие распределители памяти (аллокаторы) могут реализовывать иные стратегии поведения (см. 919.4.2). Функции гежгге() и сарае)гу() уникальны для контейнера гесгог и подобных ему контейнеров. Списки ничего подобного не предоставляют.

16.3.9. Другие функции-члены Многие алгоритмы, включая важные алгоритмы сортировки, нуждаются в операции обмена элементов местами. Очевидным способом такого обмена (913.5.2) является копирование элементов. Однако в типичном случае гесгог реализуется с помошью дескриптора доступа к его элементам (913.5, 917.1.3).

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

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

Дополнительно, предварительное вьшеление памяти гарантирует, что потенциальное исчерпание памяти и дорогостояшее перемещение элементов произойдет лишь в предсказуемый момент. Для программ реального времени это крайне важно. Заметим, что функция гевегге () не изменяет размера вектора, так что ей не надо инициализировать новые элементы. В этом отношении она полностью отличается от функции гев)хе(). Так же, как функция в(ее О возвращает текущее число элементов, функция сарае(гу() возвращает текущее значение зарезервированных мест: с.сарае(гу()— с.

в)хе ( ) дает число элементов, которые еше можно добавить без необходимости выделения дополнительной памяти. Уменьшение размера вектора не уменьшает его емкости. Это просто увеличивает число свободных мест, пригодных для будущего увеличения вектора. Чтобы вернуть память системе, нужно выполнить небольшой трюк: Глава 16. Организация библиотеки н контейнеры 560 !етр!а!е<с[азз Т, с1азз А = апосайг<Т» с1азз гес!ог ( рпЬИс: У... год! впар (гес!ага) ! аИоса!ог !уре де! аИосагог ( ) сове!; )! Функция яе! аИоса!ог() позволяет программисту получить доступ к аллокатору вектора (516.3.1, 516.3.4). Это позволяет, например, выделять память под данные программы, использующей вектор, тем же способом, что и память под сам вектор (519.4.1).

16.3.10. Вспомогательные функции ([зе!рег1(зпс11опв) Два вектора можно сравнивать операциями == и <: гетр!а!е<с!азз Т, с!азз А> Ьоо! з!И:: прего!ос== (сопз! гес!ос< Т, А > а х, сопи гессог<Т, А> а у) !етр(аге<с1азз Т, с1азз А> Ьоо[ з!И::орега!ог< (сопи гесгог<Т,А>а х, сопз! гес!ог<Т, А>а у) Два вектора г1 и г2 считаются равными, если г1. з!зе () ==г2.

з!ге () и г1(п] ==г2 [п1 лля каждого действительного индекса и. Аналогично, операция < выполняется в соответствии с лексикографическим упорядочением. Иными словами, эту операцию для векторов можно бьщо бы определить следующим образом; гетр!те<с!азз Т, сйи А> тдпе Ьоо1 за!:: орегтог< (сопз! геиог< Т, А> а х, сопи геиог<Т, А>а у) ( геапп 1ехзсоягарЬ!са1 сотраге(х.аед!и(), х.епй(), у.ьея!и(), у.епд() ) ! вся З!89 ) Это означает, что х меньше у, если первый х[з], не равный соответствующему у[!1, меньше, чем у[!], или х.з!хе О <у.з!ге() при равенстве всех х[з] соответствующим у[!].

Стандартная библиотека предоставляет также операции .' =, <=, > и >= с определениями, аналогичными таковым для == и <. Поскольку впар П является функцией-членом, она вызывается как г!.впар(г2) . Поскольку не любой тип контейнера имеет функцию-член ивар(), в обобщенных алгоритмах применяется более традиционный вызов зтгар (а, Ь) . Чтобы это работало и лля векторов, стандартная библиотека предоставляет следующую специализацию: !етр!а!е<с!азз Т, с1азз А> го!Из!И::впар (тес!ог<Т,А>а х, гес!ог<Т,А>а у) ( х. зн ар (у); 16.3.11.

Специализация )гессог<Ьоо1> Специализация тес!ог<Ьоо1> (513.5) предоставляется как очень компактный вектор элементов типа Ьоой Поскольку любая переменная типа Ьоо! адресуема, под нее 16.4. Советы отводится один байт памяти. Однако можно эффективно реализовать ыесгог<ьоо1>, отведя под каждый элемент ровно один бит. Обычные операции над векторами работают с сохранением своего смысла и над векторами типа гесгог<Ьоо1>. В частности, индексирование и итерирование выполняются вполне традиционно.

Например: ио1а' г (иессог<Ьоо1> а и) ( аког(дм 1=0; 1<и.в1ге (); ++1) с(п»и(1) I1 индексирование (уреде/'иесгог<Ьоо1>::соли вега(ог гтг /ог(И р=».Ьеа(л(); р ! = ».елИ(); -нр) сош« "р( 11прииенение итераторов ) ио(а г(иваго«<Ьоо1>а и) ( Ьоо1* р = и. Ьея(л ( ); // ... ) ~У еггоис несоответствие типов Техника адресации битов в общих чертах рассматривается в $17.5.3. Стандартная библиотека также предоставляет специальный контейнер Ь11аег (битовое поле) как множество булевых (логических) значений вместе с набором булевых операций Я17.5.3).

16.4. Советы 1. Используйте средства стандартной библиотеки для поддержки переносимости; з16.1. 2. Не пытайтесь переопределять средства стандартной библиотеки; 516.1.2. 3. Не верьте тому, что стандартная библиотека есть самое лучшее решение для любых задач. 4. Создавая новое средство, подумайте, нельзя ли его реализовать средствами стандартной библиотеки; 616.3. 5. Помните, что средства стандартной библиотеки определены в пространстве имен аМ; з16.1.2. 6. Объявляйте средства стандартной библиотеки, включая стандартный заголовочный файл (а не явным определением); ~16.1.2.

7. Пользуйтесь преимуществами поздней абстракции; З16.2.1. 8. Избегайте «жирных» интерфейсов; 516.2.2. 9. Явным циклам «из конца в начало» предпочитайте алгоритмы с обратными итераторами; з16.3.2. Чтобы этого достичь, реализация должна имитировать доступ к битам при помощи традиционного синтаксиса. Поскольку указателем нельзя адресовать единицу памяти, меньшую байта, то иесгог<Ьоо1>:: Вегагог не может быть указателем. В частности, нельзя трактовать итератор контейнеров типа иесгог<Ьоо1> как Ьоо1": 16.5. Упражнения Решение некоторых задач можно найти, посмотрев реализацию стандартной библиотеки.

Сделайте себе полезное одолжение: не пытайтесь смотреть сторонний код до того, как вы сами попробовали решить задачу. 10. 11. 12. 13. 14. 15. 16. 17. 18. 1. 2. 3. 4. 5. 6. 8. Глава ) б. Организация библиотеки и контейнеры Используйте Ьаве () для извлечения аегагог из гегегве «егагог; 816.3.2. Передавайте контейнеры по ссылке; 816.3.4. Для ссылки на элементы контейнеров используйте итераторные типы, такие как !аг<ейаг>:: Яегагог, а не указатели; 816.3.!.

Используйте константные итераторы, когда не нужно изменять значения элементов контейнера; 816.3.1. Прямо или косвенно используйте аг() в случае необходимости в проверке диапазона индексов; 816.3.3. Используйте равЬ Ьас!г() или гев!ге() для контейнеров вместо геа!!ос() для массивов; 816.3.5. Не используйте итераторов, адресуюших элементы вектора, подвергнутого операции гезае (); 816З.8. Используйте гевегге () для того, чтобы обеспечивать итераторам действитель- ность их значений на длительное время; 816.3.8. При необходимости используйте гевегге() для гарантии эффективности и корректности работы; 816.3.8.

(*1.5) Создайте гесгог<сйаг>, содержащий буквы в алфавитном порядке. Рас- печатайте элементы этого вектора в прямом и обратном порядке. ('1.5) Создайте геегог<вй !а8> и считайте в него названия фруктов из входного потока ст. Отсортируйте содержимое вектора и распечатайте его. (*1.5) Используя вектор из 816.5[2], запрограммируйте цикл распечатки всех фруктов, имена которых начинаются на букву а.

(*1) Используя вектор из 816.5[2], запрограммируйте цикл для удаления из вектора названий всех фруктов, имена которых начинаются на букву а. (*1) Используя вектор из 816.5[2], запрограммируйте цикл для удаления из вектора всех цитрусовых. (*1.5) Используя вектор из 816.5[2], запрограммируйте цикл для удаления из вектора всех фруктов, которые вы не любите. (*2) Завершите классы [гесгог, Хат и 1гог из 816.2.1. (*2.5) Отталкиваясь от класса 1гог, подумайте, как обеспечить прямые и об- ратные итераторы, итераторы для контейнера, содержимое которого может меняться в процессе итерации и итераторы для работы поверх контейнеров с неизменным содержимым.

Характеристики

Тип файла
DJVU-файл
Размер
8,84 Mb
Тип материала
Высшее учебное заведение

Список файлов книги

Свежие статьи
Популярно сейчас
Как Вы думаете, сколько людей до Вас делали точно такое же задание? 99% студентов выполняют точно такие же задания, как и их предшественники год назад. Найдите нужный учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
6458
Авторов
на СтудИзбе
304
Средний доход
с одного платного файла
Обучение Подробнее