Б. Страуструп - Язык программирования С++. Специальное издание, 3-изд. Бином. 2004 (1160791), страница 23
Текст из файла (страница 23)
Следовательно, нвм нужно вызвать во и! рпл! (соля! ра(с<соля! зег(ли, !лГ & г) ( сои! «гргз! « ' ' «г.зесолг! «к,л', для каждого элемента в массиве (,!)гз! — это первый элемент в паре, зесолс! — вто- рой). Итак, главная программа принимает впд: шгта!л () ( (зггеат Негатог<згплу а' (сиф езггеат !теса!ог<зггтлуь еок; /ог еасЬ (!!, еоз, гесоп!); аког еасЬ (Ьтгодгальбеу!л (), Йигодгат.еш! (), рыл !), Обратите внимание, что нам не приходится сортировать массив, чтобы вывол проводился в правильном порядке.
Ассоциативный массив хранит свои элементы по 3.8. Алгоритмы порядку, поэтому итерация по массиву проходит с учетом порядка (в порядке возрастания). Многне задачи требуют поиска в контейнере, а не просто совершения какой-лпба операции над каждым элементом, Например, алгоритмЯлс((2 18.18.2) предоставляет удобный способ поиска конкретного значения. Более общим вариантом этой задачи является поиск значения, удовлетворяющего некоторому условию. Например, нам может потребоваться найти в ассоциативном массиве первый элемент, больший 42. Ассоциативный массив — это последовательность пар (ключ, значение), поэтому мы будем осуществлять поиск в последовательности такай пары ра)г<е1ппд, (п1>, гле л1 б 42. Ьоо(дг 42 (соле1раи .соле1 Инпд, 1пт>Ь й О больше 42? ге1игп г еесопИ > 42; оогиЯтар<е1г1лд, 1п1>й т) ( 1урес(е) тар<егггпд, 1п1 -сопе1 11егпгогМ1; МУ1=Япс( й(тбедгп (), т епд (), д1 42), ,Для разнообразия можно подсчитать количество слов с частотой вхождения больше 42: оой2 д (сои е1 т ар< е1плд, 1л1>ь, т) ( 1п1 с42 = соип1 (г (т.Ьедт (), т ел<1 (), дг 42); 0- ) Функции типа д1 42 (), используемые для управления алгоритмом, называются лредикатами.
Предикат вызывается лля каждого элемента и возвращает логическое значение, используемое алгоритмом для принятия решения о выполнении необходимого действия. Например, функцияЯлс( (1() осуществляет поиск до тех пор, пока ее предикат не возвратит значение1 ие, означающее, что нужный элемент найден.
Аналогично, функция соип1 (1 () производит подсчет столько раз, сколько ее предикат ранен 1 ие. В стандартной библиотеке имеется несколько полезных предикатов и несколько шаблонов для создания новых предикатов Я 18А.2). 3.8.5. Алгоритмы, использующие функции-члены Многие алгоритмы применяют функцию к каждому элементу последовательности. Например, в э 3.8.4 аког еасИ (й, еое, гесог4), вызывает функцию гесол1 () для каждой строки, прочтенной из потока ввода.
Часта мы работаем с контейнером указателей и нам хочется вызывать функции- члены объектов, на которые они ссылаются, а не глобальные функции над указателем. Например, нам может понадобиться вызвать функцию-член 8))пресс(гав () для каждого элемента списка 1(е1<86аре'>. Для решения данной конкретной задачи мы Глава 3, Обзор стандартной библиотеки 100 можем проста написать функцию, не являющуюся члено»9 которая будет вызывать функцию-член. Например: по!с! «!газо (8'ларе' р) ( р->«(гаш (); оо!«(Х(!гзс< 8 Баре'>й за) ( аког еасп (зпбеу!и (),заел«)(),агат); Обобщая эту технику, приходим к: ооЫу (! !з!«Боарег»й зй) ( аког еаза (з!сбеугп (),зп.еп«!(), тет (ип (й$паре: ! ав)) Стандартный библиотечный шаблон тет тип () Я 18АА.2) принимает в качестве аргумента указатель на функп»по-член Я 15.5) и возвращает нечто, что можно вызвать для указателя на класс члена, Результат тет Гйп (й8паресс(гаш) принимает аргумент Кларе* и возвращает тоже, что и Бдаресс!гаш ().
Механизм тет Гип (] важен, так как позволяет использовать стандартные алгоритмы для контейнеров с полиморфными обьектами. 3.8.6. Алгоритмы стандартной библиотеки с1то такое алгоритм? Вот общее определение алгоритма; «конечный набор правил, который определяет послеловательпость операций для решения конкретного множества задач и обладает пятью важными чертами: Конечность... Определенность . Ввод... Вывод... Эффективность» [КппСЬ, 1968, 9 1.1). В контексте стандартной библиотеки С++ алгоритм —. это набор шаблонов, работающих с последовательностями элементов.
Стандартная библиотека содержит десятки алгоритмов. Ллгоритмы определены в пространстве имен з!з! и представлены в заголовочном файле <а(доггглт>. Вот список некоторых алгоритмов, которые я счел особенна полезными: Избранные стандартные алгоритмы сору () ип!дие сору () аког еасй () у)пс! () Япа! сЯ соил!() соил! (Г"() гер!асс() гер!асе 1Я Вызвать функцню для каждого элемента Я 18.5.1) Найти первое вхождение аргументов Я 18.5.2) Найти первое соответствие предикату Ц 18.5.2) Сосчитать число вхождений элемента Я 18.5.3) Сосчитать число соответствий предикату Я 18.5.3) Заменить элемент новым значением Я 18.6А) Заменить элемент, соответствующий предикату, новым значением Я 18.6А) Скопировать элементы Ц 18,6.1) Скопировать только различные элементы Я 18.6.1) 191 ' 3.9, Математические вычисления Отсортировать элементы Я 18.7.1) Найти диапазон всех элементов с одинаковыми значениями Я 18.7.2) Слияние отсортированных последовательностей Я 18.7.3) зог1 (( ег7иа! саиде (( тесне (] Эти и многие другие алгоритмы (см.
главу 18) можно применять к контейнерам, стро- кам е1г!пни встроенным массивам. 3.9. Математические вычисления Как и С, Сч- ь не разрабатывался специально для решения вычислительных задач. Однако, с помошью Сч-ч- производится достаточна много численных расчетов и стан- дартная библиотека отражает этот факт. 3.9.1. Комплексные числа Стандартная библиотека поддерживает семейство типов комплексных чисел, в том числе класс сотр1ех, описанный в 9 2.5.2.
Чтобы обеспечить поддержку комплексных чисел, где скалярными значениями являются числа одинарной точности с плавающей точкой 177оа1), двойной точности (с(оиЫе) и т, д., класс сатр1ех стандартной библиотеки сделан шаблоном: 1етр1а1е<с1аек еса!аг> с!икк сотр!ех ( риЫ!с: сотр!ех(еса1аг ге, еса!аг !т) оо(с(Ясотр!ех</!оа1>Я, сотр!ех<с!оиЫе> с!Ь( ( сотр!ех<!опу г(оп Ые> !с! = Я ~- кс!гг (с!Ь) дЬ -|-=/!" 2; /7 = ром (!/77, 2); //...
Подробности см. в 9 22.5. 3.9.2. Векторная арифметика Тип пес1аг, описанный в 8 3.7.1, разработан с целью предоставления общего механизма хранения значений, гибкого и согласованнага с архитектурой контейнеров, итера- торов и алгоритмов. Однако, он не поддерживает математические векторные операции. Добавить такие операции к типу пес1ог достаточно просто, но его общность и гибкость препятствуют оптимизации, которой часто придается решающее значение Для комплексных чисел поддерживаются обычные арифметические операции и наиболее общие математические функции. Например: // степень — стандартная функция от комплексного тгсли 1етр!а1е<с!аее С> сотр!ех<С> ром (сопе1 сотр1ех<С>й, !п11: 102 Глава 3.
Обзор стандартной библиотеки в серьезных вычислительных задачах, Поэтому в стандартной библиотеке имеется векторный тип, который называется иа!аггау, Он не настолько общий, но более удобен для оптимизации при вычислениях: 1етр!а!в<с!аяв Т с!иве иа1аггау ( 0" Тй орега!ог~] !в!ге б; '! ип Ыяе ! означает целый тип без знака, используемый реализацией для индексирования массива.
Для па!аггау реализованы обычные математические операции и большинство распространенных математических функций. Например: ,1/ с~нандартная функция из -ио!оггоу>, которая вычисляет модуль 1етр1а1е<с!аяя Т оа1аггау<Т> абя 1солв! иа1аггау<Т>й~! ио!с!У !иа1аггау<с1оиЫе>й а1, иа1аггау<с!оиЫе>й а2~ 1 оа!аггау<с1оиЫе> а =. а!*2.14 + а2/а 1; а2 э= а!*3.14; а = абв (а), с!оиб!е а =- а2(7~! Подробности см. в 9 22.4. 3.9.3. Поддержка базовых численных операций Обычно стандартная библиотека содержит наиболее распрострапецйые математические функции — вроде !ой 11, рого 11 или сов 1! — для типов с и лавающеп точкой (см. 9 22.3). Кроме того, для встроенных типов предусмотрены классы, описывающие их свойства, такие как максимальное значение экспоненты для!)оа! (см. 9 22.2).
3.10. Средства стандартной библиотеки Можно классифицировать средства стандартной библиотеки следующим образом: (1~ Базовая поддержка средств языка времени выполнения (например, выделение памяти и определение типа во время выполнения); см. 9 16.1.3. [2) Стандартная библиотека С (с очень незначительными изменениями для минимизации нарушений системы типов); см. 9 16.1.2. 13] Строки и потоки ввода/вывода (с полдержкой национальных алфавитов и локализации); см. главы 20 и 21.
14~ Контейнеры (такие как пес!аг !!з! и шар) и алгоритмы, их использующие(такие как проход с выполнением, сортировка и слияние); см. главы 16, 17, 18 и 19. ~5) Поддержка численных расчетов (комплексные числа, вектора с арифметическими операциями, ВТАБ-подобные и обобщенные срезы); см. главу 22. Главным критерием для включения класса в библиотеку было то, что он должен; использоваться в какой-то мере практически каждым программистом на С++ (и нович- 103 3.11. Советы ками, и экспертами); быть выражен в достаточно общем виде, но при этом не терять в производительности по сравнению с более простой формой; быть тиковым, чтобы его простому использованию можно было легко научиться.
Важно то, что стандартная библиотека Пе+ содержит наиболее общие фундаментальные структуры данных вместе с фундаментальными алгоритмами нх обработки. Каждый алгоритм работает с каждым контейнером без каких-либо преобразований. Такие среды разработки, обы шо называемые ЯТ1. (Ясапбагс( Тешр)аге 1.1)эгагу, стандартная библиотека шаблонов) [Ягерапот, 1994], можно расширить в том смысле, что пользователи имеют возможность легко создавать контейнеры и а.лгоритмы, дополняющие стандартные и работающие почти также, как они.
3.11. Советы [1] Не изобретайте колесо — пользуйтесь библиотеками. [2] Не верьте в чудеса; разберитесь, что делают ваши библиотеки, как они это делаютт и какова цена их использования. [3] Когда у вас есть выбор, отдавайте предпочтение стандартной библиотеке. [4] Не думайте, что стандартнал библиотека идеально подходит для всех задач.