Г. Шилдт - Полный справочник по C++ (1109478), страница 137
Текст из файла (страница 137)
Числовые классы ~)-")~ Числовые алгоритмы Заголовок <шыпетьс> содержчят определения ~етырех числовых алгоритмов, предназначенных лля обработки содержимого контсинера. Рассмотрим кажлый из них. Класс ассака!а1е Алгоритм ассоие?аее() вычисляет сумму всех элементов указанного диапазона и возвращает результат. Его прототип вьллялит слелуюгцим образом.
| сеир1асе <с1аяя ?п?сев, с1аяя т> т ассив1н?ас*(?п?сег понт, ?п?сел елг), т 1); сеир1аге <с1аяя ?п?сев, с1аяя т, с1аяя В1пгопс> т ассивю1ясе(?п?сег пап, ?п?сев енб т т, в?птспс )ил<); Здесь класс т описывает тип значений, которыми оперирует алгоритм Первая версия алгоритма вычисляет сумму всех элементов лиапазона, ограниченного итераторами тгагг и его.Функция ~йлс во второй версии определяет порядок суммирования элементов. Параметр у задаст начальное значение, с которо~о начинается суммирование. Рассмотрим программу, иллюстриру1овгую алгоритм асснавх?аее. демонстрация алгоритма ассоин1асе. $1пс1нбе <10ястсаге> $?пс1сг)е <нессог> ))?пс1нг)е <пштес?с> ся?пд паиеярасе ясо," ?пс яа?г.
() Уесесс<)пг> У(5); ?пс 1, соса1; ?ох(?=О; 1<5; 1++) у[1) Соеа1 = ассиппю1аее(у.бед[в(), У.атно(), О); сонг « "Сумма элементов массива У: ' « Соса1; тесигп О; Результат работы программы приведен ниже. Г) Сумма элементов массива т: 1О Алгоритм ад1асеп1 6Легепсе Алгоритм аазасепе Жккетепсе() создает новую последовательность, каждый элемент которои равен разности между соседними элементами исхода)ой последовательности.
(Первый элемент в результирующей последовательности равен первому элементу исходного массива.) Прототипы алгоритма аа5асепе а?вееяепсе() приведены ниже. | Сетпр1аее <с1аяя ?п?Сел, с1аяя Оне?еег. Оце?Сел ас(засеве О?Нетепсе(?п?Сел т(аг(, ?п1еет елИ, Осе?Сев гезий); Часть В. Библиотека стандартных классов ь Севзр1ате <с1авя 1п1тех, с1аяя Оитттех, с1авя Взприпс> Оистсет ах)засели «]111ехепсе(1п1сех аазт, 1п1сех еззхз, Оиттсех гезий, В1грипс галс] Здесь параметры зтагт и елх( являются итсраторами, установленными на начало и конец исходной последовательности. Результирующая последовательность хранится в объекте, на который ссылается итератор гелию.
Первая версия алгоритма вычисляет разность между соседними элементами, вычитая элемент, занимающий л-ю позицию, из элемента, занимающего л+)-ю позицию. Во второи версии к каждой паре соседних элементов применяется бинарная Функция 1илс. Алгоритм возвращает итератор геди(1. РаССМОтрИМ ПрИМЕр ПрИМСНСНИя аЛГОрИтМа ааэасепс дввветепсе(). 11 демонстрация алгоритма айбасепт «(111етепсе(] Вспс1иг]е «1ояттеае> В1пс1их(е <чессох> Въпс1иг]е <пивзет1с> ия1пв палзеярасе яхг)з зпс зпахг.() ( честот«1пт> ч(10), з.(10); з.пт з.
з сох [х=оз х<10; з++) ч(з) = 1*2 з спит « "Исходная последоваеельностьз йох(1=0з з<10; з++] соие «ч(з] « соих « еп61з ас]эасепт йаНетепсе(ч.Ьевьп(], ч.епх](), т.Ьедззз(])з спит « "Результат: Рох(1=оз 1<10з 1+ь) соис <« х(1] « теситп оз Результат работы программы приведе(з ниже. Исходнав посззедова.ельнохзть: 0 2 ] б В 10 12 14 16 10 Реэультаяз 0 2 2 2 2 2 2 2 2 2 Как видим, результирующая последовательность содержит разнссти между значе(зиями соседних элементов. Алгоритм ~ппег ргос$осФ Алгоритм сонет ртоззисе() вычисляет скалярное произведение двух последова- тельностей и возвращает результат.
Он имеет следующие прототипы. севзр1ате <с1аяя 1лтсет1, с1аяя 1птеет2, с1аяя Т> т зппех рхос(исх (1п1сех1 ззагг1, 1п1сех1 гш(1, 1п1тех2 иам2, Т Ю з Сеззр1аее <с1авя 1п1тех1, с1аяя тп1тет2, с1аяя Т, с1аяя В1припс1, с1авя Вхприпс2> Т хпгет ртойист(1п1тет1 иагз1, 1п1еет1 гпз(1, 1п1хет2 аагз2, Т ч, Вьприпс1 зззгзс1, Всприпс2 йзгзс2) з Глава 37. Числовые классы Здесь параметры з/аг(! и еззсз! являются итераторами, установленными на начало и конец первой последовательности.
Итератор з(пг/2 установлен на начало второй последовательности. Параметр ч задает значение, с которого начинается суммирование. Во второн версии бинарная Функция Гипс! определяет способ суммирования, а бинарная Функция /ияс2 — способ перемножения элементов последовательностей. Рассмотрим программу, демонстрирующую адпзритм дпгзатртодиое ( ) . // Демонстрация алгоритма Хппег ргое)исс() В1пс1иете <1овегеапз> Ф1пс1ис)е счесеог> Взпс1иое <пимегьс> ивдпя папеврасе водз 1по яза1п() ( чесеог<1по> ч1 (5), ч2 (5); Хпо 1, соеа1з Хог(1=0; 1<5з 1++) ч1(1) = з.з Дог(ь=оз 1<5; 1+~) ч2(1) = 1+2з Сооа1 = зппег ргог(исе(ч1.Ьед1п(), ч1.егкз(), ч2.Ьед1п(), 0)з соис <« "скалярное пронэведениез " <с соса1з геоигп 0; ) Результат работы программы приведен ниже.
Щ Скалярное произведение: 50 Алгоритм рагМа! а(пп Алгоритм рате1а1 вин() суммирует значения элементов последовательности, записывая текущую сумму в новую последовательность. (Иначе говоря, он создает последовательность, в которой хранятся частичные суммы элементов исходной последовательности.) Первый элемент результата совпадает с первым элементом исхолной последовательности. Прототипы алгоритмов имскгг следующий вид.
Селзр1аее <с1авв Хптеег, с1авв Оиотеег> Оисхсег рагсха1 вим(хпхсег злам, хпхсег еззз(, Оисхсег гелий); Семр1аее <с1авв Хптеег, с1авв Оиетеет, с1авв Вьприпс> Оисхсег раггйа1 вил(хпхсег злам, хпхсег елз(, Оиотеег гееи!Г, В1пГипс /яззс) з Здесь параметры згогг и еяз/ являются итераторами, установленными на начало и конец исходной последовательности. Результирующая последовательность хранится в объекте, на который ссылается итератор пвнг. Во второй версии способ суммирования определяется бинарной Функцией/йлс. Алгоритм возвращает итератор геев!!. Рассмотрим пример, демонстрирующий применение алгоритма рате1а1 вша(). // Демонстрация алгоритма раге1а1 возя() «1пс1иг)е <Ховсгеап> ((1пс1ие(е <чессог> ()1пс1иг)е <пилзег1с> ивьпд памеврасе вес)з Час(в й(.
Библиотека стандартных классов Рпс взаап() иесеот<апс> зз(5), т(5)з Рпе з.з Еов(1=Оз 1<10з 1н) у[1] = з.; соне « "Исходная последовательностьз Рот(1=0з 1<5з 1+ь) соне « у[з] « соне « епз51з раз е1а1 вот(У.Ьедап(), ч.епе(), т.Ьедзп())з соус « "Результат: йот(1=0; з<5з з.++) соне «с[1() « теенвп О; Результат работы программы приведен ниже. Исходная последовательностьз 0 1 2 3 4 Результат: 0 1 3 б 10 Глава 37. Числваые классы зтои главе описываются классы, прслпазначснныс лля обработки исключитель- В цых ситуаций, Кроме того, рассматриваклся классы восо рег и рааг. а также приводится краткий обзор библиотеки локализации.
: > Исключительные ситуации Стандарт языка С++ предусматривает два заголовка, связанных с исключительными ситуациями: <ехсереаоо> и <ведехсере>. Исключительные ситуации предназначены для выявления ошибок. Рассмотрим ка:каый из упомянутых заголовков. Заголовок <ехсербоп> В заголовке <ехсереаоп> определены ктассы, типы и функции, связанныс с обработкой исключительных сизуаций. Классы, опредслсзшые в заголовке <ехсерехоп>, приводятся ниже. с1аяя ехсерссоп ( роЫьс: ехсерезоп() сцго»>()> ехсерсзоп(сопяс Ьас) ехсергаоп аяЫ сЬгоь>() чз.гтца1 -ехсерсз.оп() СЬгои()з ехсерсьоп аорегасог=(сопев ехсере1оп ая(>) еЬгон()з чзгеиа1 сопяс сЬаг *ь>Ьае() сопяе ЕЬгоч>()> с1аяя Ьао ехсерезоп> риЬ11с ехсереьоп ( роЫ1 Ьас) ехсерс1оп() СЬгоы(); Ьа>) ехсергаоп(сопяс Ьас) ехсерсаоп ье(>) снгон(]> ч1гсиа1 -Ьа>) ехсерс1оп() янгон()> Ьаз] ехсерсаоп аорегасог=(сопяс ьае( ехсерсаоп ъ>(>] сцгоз>() чагеиа1 сопяе снаг *»>Ьас() сопяс сьгон()з )з (((зотов>я чо1зт(*сегехяаее ЬавсПег) () з часа(аиаехрессеа Ьазх)1ег) () з Еегесяасе Ьава1ег р сьев 1 Часть й(.
Библиотека стандартных классов Класс ехсерехоп является базовым для всех исключительных ситуаций, определешзых в стандарте языка С++. Класс ьаа ехсереаоа описывает тип исключительной ситуации, генерируемой функцией цпехресеео(). В кажлом классе есть функция-член ь>ьае(], возвращающая указатель на строку„которая заверц)ается нулевым байтом и описывает возникшую исключительную ситуацию. Класс ехсерехоп является базовым д>щ нескольких важных классов.