Бьерн Страуструп. Язык программирования С++. Специальное издание (2011) (1004033), страница 19
Текст из файла (страница 19)
У нас в шаблоне используются два параметра типа, а не один; параметр 1п относится к типу контейнера-источника, а параметр Оиг — к типу контейнера приемника. Это позволяет копировать элементы контейнера одного типа в контейнер другого типа. Например: сотр1ех ас [2001; юЫ 0 (гесгог<сотр1ех> ь»с, 11«1<оетр(ех> ь 1с) ( сору (ьас [О], ьас [200), 1с. Ьелгп () ); сору (1с. Ье01п (), 1с. еп«((), ис. Ьелгп () ); ) Этот код копирует массив в контейнер типа 1цг, а затем последний копируется в контейнер типа юсгог. Для любого стандартного контейнера функциональный вызов Ьея(п() возвращает итератор, указывающий на первый элемент последовательности.
«конца» жестко не фиксируется; им может быть специальный «элемент-часовой» (эеп1те1 е1етепг), или что-то другое. Рассмотренное понятие последовательности элементов одинаково применимо и к спискам, и к массивам. Нам требуются стандартные обозначения для операций «доступ к элементам посредством итератора» и «перевод итератора к следующему элементу». Очевидным выбором (при понимании общей идеи) является выбор стандартных знаков операции ' (операция разыменования — беге/егепсе орегагог) и операции ++ (опероция инкремента — [псгетепг орега1ог), соответственно. Теперь мы можем писать следующий код: 84 Глава 2.
Обзор языка С++ 2.8. Закпючение Не существует идеальных языков программирования. К счастью, язык и не обязан быть идеальным, чтобы быть подходящим инструментом для создания больших программных систем. На самом деле, язык программирования общего назначения не может быть идеальным одновременно для всех решаемых с его помощью задач. То, что идеально для одной задачи, в другой является скорее недостатком, ибо достижение совершенства предполагает специализацию.
Язык С++ разрабатывался так, чтобы он служил хорошим инструментом для решения широкого круга задач, и чтобы на нем можно бьно явно выразить широкий круг идей (идиом программирования). Не все можно выразить непосредственно, пользуясь встроенными средствами языка.
Но это и не нужно. Средства языка существуют для поддержки разнообразных технологий и стилей программирования. Как следствие, в процессе изучения языка нужно фокусироваться на освоении стилей программирования, для него родных и естественных, а вовсе не на подробнейшем изучении мельчайших деталей языковых конструкций. В практическом программировании мало толку от знания «потайных мест» языка или от применения максимально возможных средств. Отдельные средства языка сами по себе не представляют большого интереса.
Только во взаимодействии с другими средствами и в контексте применяемой технологии они приобретают смысл и интерес. Так что, читая последующие главы, помните, что истинной целью изучения деталей языка является стремление научиться использовать их так, чтобы поддерживать выбранный стиль программирования в контексте основательного плана построения программной системы. 2.9. Советы 1.
Не паникуйте раньше времени! Все со временем станет понятным; 52.1. 2. Для написания хороших программ вы не обязаны знать каждую деталь языка С++; в1.7. 3. Сосредоточьте внимание на технологиях программирования, а не на деталях языка; 52.!. Обзор стандартной библиотеки Зачем тратить время на обучение, если невежество Достигается мгновенно? — Хоббс Стандартная библиотека — вывод — строки — ввод — вектора — проверка диапазона — списки — ассоциативные массивы — обзор контейнеров — алгоритмы — итераторы — итераторы ввода/вывода — предикаты — алгоритмы, использующие функции-члены классов — обзор алгоритмов — комплексные числа — векторная арифметика — обзор стандартной библиотеки — советы.
3.1. Введение Ни одна значительная программа не написана исключительно лишь на «голых» конструкциях языка программирования. Сначала разрабатываются библиотеки поддержки. Затем они становятся основой для дальнейшей работы. В продолжении главы 2 здесь дается краткий обзор основных библиотечных средств, дающий представление о том, что в итоге может быть создано с помощью языка С++ и его стандартной библиотеки. Рассматриваются такие полезные типы стандартной библиотеки, как згг!ид, иесгог, !гвг и тар, а также наиболее употребительные варианты их использования. Это позволяет мне приводить более осмысленные примеры и давать более интересные упражнения в последующих главах книги.
Как и в главе 2, здесь также настоятельно рекомендуется не отвлекаться и не огорчаться из-за неполного понимания деталей излагаемого материала. Цель настоящей главы состоит в том, чтобы дать вам почувствовать, с чем прьшется столкнуться при дальнейшем обучении, а также помочь овладеть простейшими способами использования наиболее полезных средств библиотеки. Подробное введение в стандартную библиотеку дано в 516.1.2. Элементы стандартной библиотеки, которые изучаются в настоящей книге, входят составной частью в любое достаточно полное средство разработки программ на языке С++ (именуемое также средой разработки).
В дополнение к стандартной библиотеке Глава 3. Обзор стандартной библиотеки 86 языка С++ эти среды часто содержат средства реализации графического интерфейса пользователя (оконных систем или 0(Л вЂ” Отар)цса! Озег (п(еггасе), предназначенного для удобного визуального взаимодействия пользователя с работающей программой. Кроме того, многие среды поставляются еше и с разного рода «фундаментальными библиотеками», призванными поддержать корпоративные или промышленные стандарты разработки и/или выполнения программ. Я не рассматриваю такие дополнительные средства и библиотеки. Я просто хочу дать полное опьйание языка С++ в соответствии со стандартом, а также обеспечить переносимость всех примеров кода, за исключением особо оговариваемых случаев. Естественно, программист может сам, в качестве самостоятельных упражнений, ознакомиться и овладеть дополнительными средствами и библиотеками, поставляемыми с конкретной средой разработки.
3.2. Не11о, ччог1сИ (Здравствуй, мир1) Вот пример минимальной программы на языке С++: (пг та(п ( ) ( ) Она определяет функцию пга(п (), не принимающую аргументов и ничего не делающую. Каждая программа на С++ должна иметь функцию с именем пга(п. Это точка входа в программу, с которой и начинается ее выполнение. Значение типа гпг, возвращаемое программой (если оно вообще имеется, конечно), предназначено для системы, запустившей программу. Если возврат отсутствует, то система получит сообщение об успешном завершении программы. Ненулевой возврат означает аварийное завершение.
В типичном случае программы выводят некоторую информацию о своей работе. Например, следующая программа выводит строку НеИо, пог1И(: (((пс1иае <(ова еагп> (пг еа(п () ( вгй::сои( ««НеИо, иог(й! Хп«; ) Строка и/пс1пйе <1овггеат> заставляет компилятор включить сюда все объявления стандартных потоковых средств ввода-вывода (1/О Гас(((((ез) из файла 1овггеапг.
Без этих объявлений выражение вЫ:: сои( ««Непа, нег(й! ~п" не имело бы смысла. Операция «(«вставить в поток») осуществляет вывод своего правого аргумента в левый аргумент. В данном случае, строковый литерал «Нева, погЫ."~п» записывается в стандартный поток вывода вгИ:: сопг. Стпроковый литерал (згг(п» И(его/) является последовательностью символов, заключенных в двойные кавычки. В строковых литералах символ ~ (обратная наклонная черта) и следующий за ним в совокупности означают один специальный символ.
В данном случае, ~п означает специальный символ «перевода ппроки», так что сначала выводится текст НеИо, мог1И(, а затем осуществляется переход на новую строку (на новую строку устройства вывода). 3.3. Пространство имен стандартной библиотеки 87 3.3. Пространство имен стандартной библиотеки Стандартная библиотека определена в пространстве имен зИ (52.4, 88.2). Вот почему я пишу зИ:: сои!, а не просто сои!. То есть я указываю явным образом, что используется именно сои! из стандартной библиотеки, а не какой-то другой сои!. Любое средство стандартной библиотеки объявлено в каком-либо стандартном заголовочном файле, аналогичном файлу 1озггеат.
Например: Ипс1идв <зо 1па> Нос!аде <Дзз> Теперь доступны такие типы стандартной библиотеки, как зи !пя и !аг. Для этого нужно явно использовать префикс м»1::, как в следующем примере: ззд:: гнпп№ з = "Гонг!ввз Свод; !но 1вдз Вааад ) "; зМ:: 11зг<зсд:: ззнп8> в!ода аз; Однако для упрощения записи примеров в дальнейшем я буду редко использовать префикс зИ::, и также редко буду явно включать в код примеров строки №!пс!ив!е с необходимыми стандартными заголовочными файлами. Чтобы скомпилировать и запустить на выполнение код примеров, вы сами должны включить все необходимые заголовочные файлы (перечислены в 83.7.5, 53.8.6 н 516Л.2).
Кроме того, вы должны или явно добавлять префикс мИ::, или делать все имена из м«! глобально доступными 58.2.3). Например: ()1пс!идв <ззпп8> Р вктючает объявления стандартных средств работы со строками изгп8 патезрасе зи1; У делает имена нз зМ доступными без префикса зМ:: зтппа з = "!дпогапсв 1з Ы1т! "; У оМ: згггпб означает згд:: зтппк В общем случае, «сброс» имен из мв! в одно глобальное пространство имен является дурным тоном. И, тем не менее, чтобы укоротить тексты примеров, описывающих применение средств С++ и библиотеки, я часто опускаю повторяющиеся строки №1пс!ив!е и зМ:: префиксы. В настоящей книге я использую почти исключительно средства стандартной библиотеки языка С++, так что, если в примере встречается имя из стандартной библиотеки, то это либо демонстрация его стандартного применения, либо фрагмент, поясняющий, как стандартное библиотечное решение может быть определено.
3.4. Вывод В стандартной библиотеке с помощью заголовочного файла 1оз!геапз определяются средства вывода для каждого встроенного типа. Кроме того, несложно расширить эти средства и на пользовательские типы. По умолчанию, величины, выводимые в поток сои!, автоматически преобразуются в последовательный набор символов. Например, следующий код во!№ !'( ) ( сои!«!Ог Глава 3. Обзор стандартной библиотеки 88 поместит в стандартный поток вывода сначала символ 1, а затем символ О. То же са- мое происходит и в следующем примере: гоЫ0() ( 1и!1 = 10; сои!«1) Данные разных типов смешиваются очевидным образом: гоЫ й (1и! 1] ( сои!« "!йе еа1ие о1'! Ы сои!«! г сои!« ' ~и'; ) Если ( равно П), то в поток вывода попадет следующая последовательность символов: ейе га!ие о)'1 1е 10 Сшиеольиой константой (слагас!ег соле!ап!) называется символ, заключенный в одиночные кавычки.