Главная » Просмотр файлов » Г. Шилтд - Самоучитель C++ (PDF)

Г. Шилтд - Самоучитель C++ (PDF) (1114887), страница 69

Файл №1114887 Г. Шилтд - Самоучитель C++ (PDF) (Г. Шилтд - Самоучитель C++ (PDF)) 69 страницаГ. Шилтд - Самоучитель C++ (PDF) (1114887) страница 692019-05-08СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

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

Иногда полезно генерировать новую последовательность, состоящую толькоиз определенных фрагментов исходной последовательности. Одним из предназначенных для этого алгоритмов является алгоритм remove_copy(), основная форма которого представлена ниже:template<class Inlter, class Outlter, class T>Outlter remove copy (Inlter начало,Inlter окончание, Outlter результат, const Т йзнауение) ;Алгоритм remove_copy() копирует элементы, равные параметру значение, иззаданного итераторами начало и окончание диапазона и размещает результатв последовательности, обозначенный итератором результат.

Алгоритм возвращает итератор конца новой последовательности. Результирующий контейнер должен быть достаточно велик для хранения новой последовательности.В следующем примере показана работа алгоритма remove_copy(). Сначала впрограмме создается чередующаяся последовательность значений 1 и 2. Затем из последовательности удаляются все единицы.// Демонстрация алгоритма remove_copyttinclude <iostream>tfinclude <vector>^include <algorithm>using namespace std;int main( ){vector<int> v, v2(20);int i;for(i=0; i<20;i f ( i % 2 ) v.push_back(l) ;else v.push__back{2) ;Глава14.Библиотекастандартныхшаблонов_459cout « "Последовательность: ";for(i=0; Kv.sizeO; i++) cout « v[i] « " ";cout « endl;// удаление единицremove_copy ( v .

begin () , v.end() , v2 .begin {) , 1) ;cout « "Результат: ";for(i=0; i<v2.size(); i++) cout « v2[i] « "cout « endl;,return 0;После выполнения программы на экране появится следующее:Последовательность:2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1Результат: 2 2 2 2 2 2 2 2 2 2 0 0 0 0 0 0 0 0 0 03. Еще одним полезным алгоритмом является алгоритм reverse(), который меняет порядок расположения элементов последовательности на обратный.Ниже представлена основная форма этого алгоритма:template<class Bilter>void reverse (Bitter начало, Bilter окончание) ;Алгоритм reverse() меняет на обратный порядок расположения элементов вдиапазоне, заданном итераторами начало и окончание.В следующем примере показана работа алгоритма reverse().// Демонстрация алгоритма reverse^include <iostream>#include <vector>^include <algorithrn>using namespace std;int main{){vector<int> v;int i;for(i=0; i<10,- i++) v.push_back(i) ;cout « "Исходная последовательность : " ;for(i=0; i<v.

size(); i++) cout « v[i] « " ";cout « endl;reverse (v. begin ( ) , v.end(} ) ;cout « "Обратная последовательность: ";for(i=0; Kv.sizeO; i++) cout « v[i] « " ";return 0;460_СамоучительC++После выполнения программы на экране появится следующее:Исходная последовательность : 0 1 2 3 4 5 6 7 8 9Обратная последовательность : 9 8 7 6 5 4 3 2 1 04. Одним из наиболее интересных алгоритмов является алгоритм transform(),который модифицирует каждый элемент некоторого диапазона в соответствии с заданной вами функцией. Алгоритм transform() имеет две основныеформы:template<class Inlter, class Outlter, class FunOOutlter transform (Inlter качало, Inlter окончание,Outlter результат, Func унарная_^функцяя) ;template<class Inlterl, class Inlter2, class Outlter, class Func>Outlter transform (Inlterl начало!, Inlterl окончание!,Inlter2 аачало2, Outlter результат, Func бииарная_функция) ;Алгоритм transform() применяет функцию к диапазону элементов и сохраняет результат в месте, определенном итератором результат.

В первой формедиапазон задается итераторами начало и окончание, а применяемой функциейявляется унарная_функция. Эта функция в качестве параметра получает значение элемента и должна возвратить модифицированный элемент. Во второйформе модификация осуществляется с помощью бинарной операторфункции бинарная_функция, которая в качестве первого параметра получаетзначение элемента из предназначенной для модификации последовательности, а в качестве второго параметра — элемент из второй последовательности.

Обе версии возвращают итератор конца итоговой последовательности.В следующей программе для модификации используется функция xformQ,которая возводит в квадрат элементы списка. Обратите внимание, что итоговая последовательность хранится в том же списке, что и исходная последовательность.// Пример использования алгоритма transform^include <iostream>#include <list>^include <algorithm>using namespace std;// Простая функция модификацииint x f o r m f i n t i) {return i * i; // квадрат исходного значенияint main (){list<int> xl;int i;Глава14.Библиотекастандартныхшаблонов_461__II размещение значений в спискеfor (1=0; i<10; 1++) xl .push_back (i) ;cout « "Исходное содержимое списка xl: ";list<int>: : iterator p = xl.beginO;whiletp !=xl.end()) {cout « *p « " ";P++;cout « endl;// модификация элементов списка xlp = transform(xl.

begin () , xl.endf), xl. begin (), xform) ;cout « "Модифицированное содержимое списка xl: ";p = xl. begin () ;while (p != xl.endO) {cout « *p « " ";return 0;}После выполнения программы на экране появится следующее:Исходное содержимое списка xl: 0 1 2 3 4 5 6 7 8 9Модифицированное содержимое списка xl: О 1 4 9 16 25 36 49 64 81Как видите, возведен в квадрат каждый элемент списка xl.Алгоритм sort() имеет следующие основные формы:template<class Randlter>void sort(Randlter начало, Randlter окончание);template<class Randlter, class Comp>void sort(Randlter начало, Randlter окончание,Comp фуяхция_сравн&ния);Алгоритм сортирует элементы диапазона, заданного итераторами начало иокончание.

Во второй форме имеется возможность задать функцию сравнения, которая определяет, является ли один элемент меньше, чем другой. Напишите программу, демонстрирующую работу алгоритма sort(). (Выберите туего форму, которая вам больше нравится.)462Самоучитель C++2. Алгоритм merge() выполняет слияние двух упорядоченных последовательностей, а результат слияния размещает Б третьей последовательности.

Нижепоказана одна из основных форм этого алгоритма:template<class Inlterl, class Inlter2, class Outlter>Outlter merge(Inlterl начало!, Inlterl окончание!,Inlter2 начало2, Inlter2 oxonva*use2, Outlter результат) ;Последовательности, предназначенные для слияния, обозначены итераторами начало!, окончание! и начало2, окончание2.

Место размещения итоговойпоследовательности обозначено итератором результат. Алгоритм возвращаетитератор конца итоговой последовательности. Продемонстрируйте работуэтого алгоритма.14.7. Строковый классКак известно, в C++ встроенный строковый тип данных сам по себе неподдерживается. Тем не менее для обработки строк здесь имеется две возможности. Во-первых, можно использовать хорошо вам знакомый оканчивающийся нулем символьный массив. О таком массиве иногда говорят как остроке в стиле С (С string).

Второй метод, который и рассматривается в этомразделе, подразумевает использование объектов типа string.Фактически, класс string является конкретизацией более общего классашаблона basic_string. На самом деле у класса basic_string имеется два производных класса: класс string, который поддерживает строки 8-разрядных символов, и wstring, который поддерживает строки широких символов. Поскольку при обычном программировании чаще всего имеют дело именно с8-разрядными символами, мы рассмотрим только версию string базовогокласса basic_string.Перед тем как начать изучение класса string, важно понять, почему онвключен в библиотеку классов C++.

Стандартные классы появились в C++не случайно. Фактически, включению в библиотеку каждого нового классасопутствовало множество споров и дискуссий. Добавление в C++ классаstring на первый взгляд кажется исключением из этого правила, поскольку вC++ в качестве строк уже поддерживаются оканчивающиеся нулем массивы. Тем не менее это далеко не так, и вот почему: оканчивающиеся нулемсимвольные массивы нельзя обрабатывать посредством стандартных операторов C++ и они не могут быть частью обычных выражений C++. Например, рассмотрим следующий фрагмент программы:char si[80], s2[80], s3[80];si = "раз"; // не допускаетсяs2 = "два"; // не допускаетсяs3 = si + s2; // ошибка, снова не допускаетсяГлава 14.

Библиотека стандартных шаблонов463Как показано в комментариях, в C++ нельзя использовать оператор присваивания, чтобы дать символьному массиву новое значение (за исключением инициализации), а для конкатенации двух строк нельзя использоватьоператор сложения. Эти операции приходится выполнять с помощью показанных ниже библиотечных функций:strcpy(si,Strcpy{s2,strcpy{s3,strcpy (s3,"раз");"два");si);s2);Поскольку оканчивающиеся нулем символьные массивы по своей сути технически не являются типами данных, к ним нельзя применять операторыC++.

Это приводит к тому, что даже самые элементарные операции состроками становятся чрезвычайно запутанными. Невозможность использования стандартных операторов C++ для работы с оканчивающимися нулемсимвольными массивами и стала основной причиной разработки стандартного строкового класса.

Вспомните, когда вы в C++ определяете класс, выопределяете новый тип данных, который может быть полностью интегрирован в среду программирования C++. Само собой это означает, что относительно нового класса можно перегружать операторы. Таким образом, благодаря добавлению в C++ стандартного класса string, становится возможнымобрабатывать строки точно таким же образом, каким обрабатываются данные других типов, а именно с помощью операторов.Имеется, однако, и еще один довод в пользу использования стандартногокласса string — это обеспечение безопасности. Неопытный или неосторожный программист может очень легко выйти за границы массива, в которомхранится оканчивающаяся нулем строка.

Например, рассмотрим стандартную функцию копирования строк strcpy(). В этой функции совершенно отсутствуют какие бы то ни было атрибуты, предназначенные для контроляграниц целевого массива. Если в исходном массиве оказывается большесимволов, чем может поместиться в целевом массиве, вполне возможна (идаже весьма вероятна) программная или даже системная ошибка. Как вы вдальнейшем увидите, стандартный класс string предотвращает саму возможность возникновения подобных ошибок.Итак, для включения в C++ стандартного класса string имеется три довода:совместимость (теперь строка становится типом данных), удобство (можноиспользовать стандартные операторы C++) и безопасность (границы массива не нарушаются).

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

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

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

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