Стенли Липпман - Язык программирования C++. Пятое издание
- Название:Язык программирования C++. Пятое издание
- Автор:
- Жанр:
- Издательство:Издательский дом Вильямс
- Год:2014
- Город:Москва
- ISBN:978-5-8459-1839-0
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Стенли Липпман - Язык программирования C++. Пятое издание краткое содержание
Вы держите в руках новое издание популярного и исчерпывающего бестселлера по языку программирования С++, которое было полностью пересмотрено и обновлено под
. Оно поможет вам быстро изучить язык и использовать его весьма эффективными и передовыми способами. В соответствии с самыми передовыми и современными методиками изложения материала авторы демонстрируют использование базового языка и его стандартной библиотеки для разработки эффективного, читабельного и мощного кода.
С самого начала этой книги читатель знакомится со стандартной библиотекой С++, ее самыми популярными функциями и средствами, что позволяет сразу же приступить к написанию полезных программ, еще не овладев всеми нюансами языка. Большинство примеров из книги было пересмотрено так, чтобы использовать новые средства языка и продемонстрировать их наилучшие способы применения. Эта книга — не только проверенное руководство для новичков в С++, она содержит также авторитетное обсуждение базовых концепций и методик языка С++ и является ценным ресурсом для опытных программистов, особенно желающих побыстрей узнать об усовершенствованиях С++11.
Стенли Б. Липпман Жози Лажойе Барбара Э. Му • Узнайте, как использовать новые средства языка С++11 и стандартной библиотеки для быстрого создания надежных программ, а также ознакомьтесь с высокоуровневым программированием
• Учитесь на примерах, в которых показаны передовые стили программирования и методики проектирования
• Изучите принципы и узнайте почему язык С++11 работает именно так
• Воспользуйтесь множеством перекрестных ссылок, способных помочь вам объединить взаимосвязанные концепции и проникнуть в суть
• Ознакомьтесь с современными методиками обучения и извлеките пользу из упражнений, в которых подчеркиваются ключевые моменты, позволяющие избежать проблем
• Освойте лучшие методики программирования и закрепите на практике изученный материал
Исходный код примеров можно загрузить с веб-страницы книги на сайте издательства по адресу: http://www.williamspublishing.com
Язык программирования C++. Пятое издание - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
c1 = c2; // заменяет содержимое контейнера c1 копией
// элементов контейнера c2
c1 = {a,b,c}; // после присвоения контейнер c1 имеет размер 3
После первого присвоения контейнеры слева и справа равны. Если контейнеры имели неравный размер, после присвоения у обоих будет размер контейнера из правого операнда. После второго присвоения размер контейнера c1составит 3, что соответствует количеству значений, представленных в списке.
Таблица 9.4. Операторы присвоения контейнеров
c1 = c2 |
Заменяет элементы контейнера c1копиями элементов контейнера c2. Контейнеры c1и c2должны иметь тот же тип |
с = {a, b, с...} |
Заменяет элементы контейнера c1копиями элементов списка инициализации. (Недопустимо для массива.) |
swap(c1, c2) c1.swap(c2) |
Обменивает элементы контейнеров c1и c2. Контейнеры c1и c2должны иметь тот же тип. Обычно функция swap()выполняется намного быстрее, чем процесс копирования элементов из контейнера c2в c1 |
| Операторы присвоения недопустимы для ассоциативных контейнеров и массива | |
|---|---|
seq.assign(b,е) |
Заменяет элементы в контейнере seqтаковыми из диапазона, обозначенного итераторами bи е. Итераторы bи ене должны ссылаться на элементы в контейнере seq |
seq.assign(il) |
Заменяет элементы в контейнере seqтаковыми из списка инициализации il |
seq.assign(n,t) |
Заменяет элементы в контейнере seqнабором из nэлементов со значением t |
В отличие от встроенных массивов, библиотечный тип arrayподдерживает присвоение. У левых и правых операндов должен быть одинаковый тип:
array a1 = {0,1,2,3,4,5,6,7,8,9};
array а2 = {0}; // все элементы со значением 0
a1 = а2; // замена элементов в a1
а2 = {0}; // ошибка: нельзя присвоить массиву значения из списка
Поскольку размер правого операнда может отличаться от размера левого операнда, тип arrayне поддерживает функцию assign()и это не позволяет присваивать значения из списка.
Связанные с присвоением операторы делают недопустимыми итераторы, ссылки и указатели на контейнер слева.
assign()(только последовательные контейнеры)Оператор присвоения требует совпадения типов левых и правых операндов. Он копирует все элементы правого операнда в левый. Последовательные контейнеры (кроме array) определяют также функцию-член assign(), обеспечивающую присвоение разных, но совместимых типов, или присвоение контейнерам последовательностей. Функция assign()заменяет все элементы в левом контейнере копиями элементов, указанных в ее аргументе. Например, функцию assign()можно использовать для присвоения диапазона значений char*из вектора в список строк:
list names;
vector oldstyle;
names = oldstyle; // ошибка: типы контейнеров не совпадают
// ok: преобразование из const char* в string возможно
names.assign(oldstyle.cbegin(), oldstyle.cend());
Вызов функции assign()заменяет элементы в контейнере namesкопиями элементов из диапазона, обозначенного итераторами. Аргументы функции assign()определяют количество элементов контейнера и их значения.
Поскольку существующие элементы заменяются, итераторы, переданные функции assign(), не должны относиться к контейнеру, для которого вызвана функция assign().
Вторая версия функции assign()получает целочисленное значение и значение элемента. Она заменяет указанное количество элементов контейнера заданным значением:
// эквивалент slist1.clear();
// сопровождается slist1.insert(slist1.begin(), 10, "Hiya!");
list slist1(1); // один элемент; пустая строка
slist1.assign(10, "Hiya!"); // десять элементов; со значением "Hiya!"
swap()Функция swap()меняет местами значения двух контейнеров того же типа. Типы контейнеров и их элементов должны совпадать. После обращения к функции swap()элементы правого операнда оказываются в левом, и наоборот:
vector svec1(10); // вектор из 10 элементов
vector svec2(24); // вектор из 24 элементов
svec1.swap(svec2);
После выполнения функции swap()вектор svec1содержит 24 строки, а вектор svec2— 10. За исключением массивов смена двух контейнеров осуществляется очень быстро — сами элементы не меняются; меняются лишь внутренние структуры данных.
За исключением массивов функция swap()не копирует, не удаляет и не вставляет элементы, поэтому она гарантированно выполняется за постоянное время.
Благодаря тому факту, что элементы не перемещаются, итераторы, ссылки и указатели в контейнере, за исключением контейнера string, остаются допустимыми. Они продолжают указывать на те же элементы, что и перед перестановкой. Однако после вызова функции swap()эти элементы находятся в другом контейнере. Предположим, например, что итератор iterобозначал в векторе строк позицию svec1[3]. После вызова функции swap()он обозначит элемент в позиции svec2[3]. В отличие от других контейнеров, вызов функции swap()для строки делает некорректными итераторы, ссылки и указатели.
В отличие от поведения функции swap()с другими контейнерами, когда дело доходит до массивов, элементы действительно обмениваются. Обмен двух массивов потребует времени, пропорционального количеству их элементов.
После выполнения функции swap(), указатели, ссылки и итераторы остаются связанными с тем же элементом, который они обозначили ранее. Конечно, значение самого элемента заменено значением соответствующего элемента другого массива.
Новая библиотека предоставляет функцию swap()в версии члена класса контейнера и в версии, не являющейся членом какого-либо класса. Прежние версии библиотеки определили только версию функции-члена swap(). Функция swap()не являющаяся членом класса контейнера, имеет большое значение в обобщенных программах. Как правило, лучше использовать именно эту версию.
Упражнение 9.14. Напишите программу, присваивающую значения элементов списка указателей на символьные строки в стиле С (тип char*) элементам вектора строк.
Интервал:
Закладка: