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

Б. Страуструп - Язык программирования С++. Специальное издание, 3-изд. Бином. 2004 (1160791), страница 139

Файл №1160791 Б. Страуструп - Язык программирования С++. Специальное издание, 3-изд. Бином. 2004 (Б. Страуструп - Язык программирования С++. Специальное издание, 3-изд. Бином. 2004) 139 страницаБ. Страуструп - Язык программирования С++. Специальное издание, 3-изд. Бином. 2004 (1160791) страница 1392019-09-19СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

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

Например: оо!й! (оес1ог !п1>Ь и, сопИ оес1ог !лРЙ ос) ( 1урейеуСЬесуей !1ег оес1ог<Ж>, пес!ой -тРэ!1егасог С1; Сгр! = таус сЬесуей(о, оЬерп()+3); СУр2 = таус свесьей (о); О по умолчаниях указывает на первьш вке>ьент 1урейе! СЬесЬей !1ег< сон И пес!о г<! пР, оес!ог<!пРэсопк1 !1ега1ог> С1С; С1С ру = таус свесдес! (ос, ос.уеу!и ()~-3); С!С р4 = таде сЬесЬей (ос), сопк! оесгог<!пРЙ ои = о; С!С р5 = тауе сЬесдей (о, ооЬеу1п ()); По умолчанию константные контейнеры имеют константные итераторы, так что их СЬесуей !1ег тоже должны быть константными итераторами.

Итератор рб показывает одни из способов получения константного итератора из неконстантного контейнера. 627 19.3. Итераторы с проверкой (с)зескед йег) Это демонстрирует, почему Сйесйес! !1ег нужно два параметра шаблона: один — для типа контейнера, а второй — чтобы выразить различие константный/неконстантны й. Имена зтих типов Сйес/гес( !1ег становятся довольно длинными и громоздкими, но зто не имеет значения, когда итераторы используются как ар!ументы в обобщенных алгоритмах. Например; 1етр1а1е<с1аяк!1ег> по!б туког! (!1сгЯгкг 11ег1акг) по!с!У(пес!от 1пт й с) ггу ( туяпг1 (тадк сдесуес((с), та!ке сдесусс((с, сспс(()); ) са1сй (оиг оУ' Ьоипс!к) ( сегг « 'Ага: в туког! () ошибка~а"; аьог1 (); Первоначальная версия такого алгоритма располагается именно там, где я более всего склонен подозревать возможную ошибку выхода за пределы диапазона, так что использование итератора с проверкой имеет смысл. Представлением Сдес!яес( !!ег является указатель на контейнер и итератор, указывающий внутрь контейнера: 1етр!а!с<с!акк Сап 1, с1 а як 11ег = 1ур ела те Сепг: у!ега!ог) с!акк СЬесусс( Мег: риЫ!с !1ега1ог ггаггк<!1кг ( 11ег сигг, О тператор для текущей позиции СоШ' с, 1/указатель на текугцпй контейнер Одним из приемов для определения желаемых типов является создание типов, производных от !1ега1ог 1га!1я.

Очевидная альтернатива — создание типов, производных от !1ега1ог — в данном случае будет сли!иком многословной (как зто было для геоегке с1ега1ог, ф 19.2.5). Поскольку нет требования, чтобы итератор был классом, и нет требования, чтобы нтераторы, которые явлшотся классами, вронсходили бы от !1ега1ог. Все операции в Спесйе1( !!ег довольно тривиальны: 1етр!а1е<с!акк Сап!, с!аяя !1ег = гурвпате Сопгь!1ега1ог~ с!акк СЬесдед Исг: риЫ!с нега!ос 1га!!к<Пег> ( уу,— риЫ!с ион( иа11г( (Нег р) сопя! ( (1 (с — ' епг! () == р) ге1игп; уог (11ег рр=с — иЬеу!л (); рр!=с->епй (); ч-грр) (!' (рррр) ге!игл; 1Ьгогкои1 оу Ьоипак (); ) уг!епс(Ьоо! орегасог== (сопя! СЬесуес! 11сгй Ь сопк1 СБесдес! 11егс !) ( ге1игп 1,с==!.с М Ьсигг==!'.сигг ! О нет инициализатора по умолчанию Глава 19. Итератсры и распределители памяти // используем копарующпи конструктор по умолнанию // и копирующее присваивание по ульолчанню Сбесбей 11ег(Соп1йх,фйегр) с($х),сшт(р) (оа!!й(р);) Сбесбей !!ег(Соп1йх): с(бх), сиге(х Ьеу!и()) ( ) ге/егепсе орега1ог' () сопз1 ( Ц (сиге==с->епй ()) 1бгов ои1 о/ Ьоипйз (); ге!игл *снег; ро!п1егорега1ог- () сопв1 ( // проверяется оператором * ге1игп $'сиге ( (/ (с- епй () — сигг й() й -(сигг — с->Ьеут ())) !Ьгов ои1 оХ Ьоипйв (); ге!игл Савойей !1ег (с, сиггьй); геУегепсе орега1ог() (ЖЯегепсе й) сопл! // только для нтераторов //с произвольным доступол! (/ (с- епй ()-сиге<=й(й — (сиге-с->Ьеу!и ()) ) 1Ьгов ои1 о/ Ьоипйз (), ге!игп сиге(й); Самее!сей !1егй орега1огь<- () // префиксный опера!пор ++ (/ (сигг==с->епй ()) 1бгов ои1 о/ Ьоипйз (); -Н-сиге,.

ге1игп '1Ь!з; Сбесйей 1!его орега1ог++ (!пй ( Савойей !!ег!тр ='!Ь!з; л-ь'1Ь!з, ге1игп 1тр; // постфнксный оператор>.> // проверяется префиксным -н- Сбесией !!егь орега1ог — () ( // префиксный оператор— ~~' (сиге== с->бед!и ()) 1Ьгов ои1 о/ Ьоипйз (); — сиге, ! е1игп *!Ь!в; //постфиксный оператор— Сбесбей Мегй орега1ог-- (!и!) ( Сбесбей !1ег1тр= '!Ь!з; — *1Ыв, ге!игп !!пр; //проверяется префиксныль— Сбесйей 1!ее прего!ось фЯегепсе й) сопв! // только для итераторов // с произвольным доступа и 629 19.3. Итераторы с проверкой (свесхен йег) // только для произвольноео доступа с(Щегепсе 1уре 1пдех () сопз1 ( ге1игп сиге-с.бедгп (); ) йег ил сйес)сес( () сопз1 ( ге1игп сигг; )' //+, —, < и т и.

1'у" 1у.б[б)) Сйеейег1 (1ег может быть и ниц пал из пров ан только для конкретного ите рата ра, указывающего на конкретный контейнер, В полноценной реализапии должна быть обеспечена более эффективная версия функции оасЫ () для итераторов с произвольным доступом (5 19.6[6)). Когда САесйес( (1ег инициализирован, все операции, изменяющие позицию итератора, проверяются: действительно ли итератор по-прежнему указывает внутрь контейнера.

Попытка заставить итератор указать за пределы контейнера приводит к генерации исключения ои1 о/ Ьоипе(з. Например; оо1<Ц(11зг<згггпрд, 1з) ( (п1 соип1=0; 1гу ( СйесЬес( 11е~ 11з1<з1г(пи» р (1з, (з Ьерп ()); юЬ11е (1гие) ( Н "р, // рано или поздно иы достигнеи конца ++соип1. са1сй (оиг о/ Ьоипдз)( сои1 « 'велход за пределы после" «соип1 « ' проходов'~п' ) Итератор Сйесйеа1 11ег знает, в какой контсйнср указывает, и это позволяет ему отловить некоторые (но не все) случаи, когда, итераторы в контеинере становятся недействительными в результате операций над ним (9 16.3.6, 9 16.3.8). Для полной зашиты от таких случаев может понадобиться разработать другой, менее экономный итератор (см. 6 19.6[7)).

Отметим, что пост-инкремент (постфиксный оператор ++) использует промежуточную переменную, а пре-инкремент (префиксный оператор ++) нет. По этой причине, для итераторов предпочтительнее++р, а не р+ж. Поскольку Сйесйест 11ег содержит указатель на контейнер, ого нельзя использовать для встроенных массивов напрямую.

При необходимости можно воспользоваться массивом с аггау(9 17.5А). Для завсршения темы об итераторах с проверкой мы должны сделать их простыми в применении. Здесь есть два основных подхода: [1) Определить тип контейнера с проверкой, ведущего себя так же, как другие контейнеры, но обеспечивающего лишь ограниченный набор конструкторов, и его Ьеячп (), епН () и т. п.

предоставляют не обычные итсраторы, а Сйесйес( 11ег. [2) Определить дескриптор, который может быть инициализирован произвольным контейнером, и который обеспечивает «провсряющие» функции доступа к своему контейнеру (5 19.6[8)). Следующий шаблон соединяет нтератор с проверкой и контейнер: Глава 19. Итераторы и распределители памяти 630 1етр!а1е<с1аяя С> с!аяя СЬесЬей: риЫсс С ( риЫ!с: ехр!!с!1 СЬесйей (сйзе ! и) ' С (и) () СЛесйей (): С () () 1урейе~СЬесуей Иег<С> 11ега1ог; 1урейез Савойей нег-С,Стсопя1 !1ега1ог сопя! цегасог, !1ега1ог Ьеут () ( ге1ш л !1егагог (*1Ыя, С:Ьеу!и ()); ) 11ега1огелй() ( ге1игп нега1ог(*1рйя, С: епй у); ) сопя! Нега1огЬеугп () сопя1 ( ге!игл сопя! !1ега1ог(*1Ыя, С>Ьеут ()), ) сопя! !1егагогепй () соля!( ге1игп сопя! Цега1ог('1Ыя, Сзепй()); ) 1урепате Ссге~егелсе 1уре орега1оК] (1урелате Ссясее 1уре л) ( ге1игл СЬесйей йе> С> (*1Ыя) (и]; ) СЬ Ьаяе () ( ге!игл 1Ыв; ) // получили базовый контейнер ) Это позволяет нам написать; СБесйей<оес1ог<!л1» иес (10), СЬесаей<!Ьй<йоиЫе» !я1; эо!й/() ( // все в порядке // возбуждает ои! о/ Ьоппйя тго! = оес(5]; !п1 о2 = оес(15]; и !я1 рияЬ Ьаей (о2~); туяогт(оесдеу!л (), оесепй()); сору (лес.Ьеугп (), иес.епй(), !я1.Ьекгп ()); иоЫ у (вес!ос<те> о!) ( СЬесуей 11ег иес1ог т1 р (и, т Ьед!п ()); О.

ий ! .= рйлйех (); // полу<вел текуи(ую лозииию о!. геиге (100); // р слш нови<лез недействи тсльныл р = СЬесаей нег<пес!о> <!л1» (о1, и!.Ьеу!п ()<!); О восстанавливаел //текуи!ую позш!ию Старая — и недействительная теперь — текущая позиция теряется. Я предоставил функцию !пйех () как средство для извлечения индекса, что позволяет восстанавли- вать итераторы с проверкой. Очевидно, избыточная функция Ьаяе () позволяет сделать интерфейс функции Сйесйес! () аналогичным интерфейсу дискриптора (вспомогательного класса) в контейнерах. Дискрнптор контейнера обычно нс обеспечивает неявного преобразования в контейнеры. Гели контейнер изменил свои размеры, все нтераторы в нем — в том числе и с проверкой — могут стать недействительными.

В этом случае итераторы типа Сйес)сей !1ег могут быть инициализированы заново: 631 19.4. Распределители памяти 19.3.1. Исключения, контейнеры и алгоритмы Вы могли бы возразить, что использование и стандартных алгоритмов, и итераторов с проверкой напоминает одновременное ношение ремня и подтяжек; безопасность обеспечивает и то, и другое. Однако опыт показывает, что для многих людей и многих прикладных программ доза паранойи не помешает — особенно, когда в программу часто вносятся изменения несколькими людьми. Один из способов проверки во время выполнения — это держазь в кодс проверочные фрагменты. Затем, перед сдачей программы, они удаляются. Эту практику сравнивают с надеванием спасательного жилета при плавании вблизи берега и сниманием прп выходе в открытое море.

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

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

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

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