Стенли Липпман - Язык программирования C++. Пятое издание
- Название:Язык программирования C++. Пятое издание
- Автор:
- Жанр:
- Издательство:Издательский дом Вильямс
- Год:2014
- Город:Москва
- ISBN:978-5-8459-1839-0
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Стенли Липпман - Язык программирования C++. Пятое издание краткое содержание
Вы держите в руках новое издание популярного и исчерпывающего бестселлера по языку программирования С++, которое было полностью пересмотрено и обновлено под
. Оно поможет вам быстро изучить язык и использовать его весьма эффективными и передовыми способами. В соответствии с самыми передовыми и современными методиками изложения материала авторы демонстрируют использование базового языка и его стандартной библиотеки для разработки эффективного, читабельного и мощного кода.
С самого начала этой книги читатель знакомится со стандартной библиотекой С++, ее самыми популярными функциями и средствами, что позволяет сразу же приступить к написанию полезных программ, еще не овладев всеми нюансами языка. Большинство примеров из книги было пересмотрено так, чтобы использовать новые средства языка и продемонстрировать их наилучшие способы применения. Эта книга — не только проверенное руководство для новичков в С++, она содержит также авторитетное обсуждение базовых концепций и методик языка С++ и является ценным ресурсом для опытных программистов, особенно желающих побыстрей узнать об усовершенствованиях С++11.
Стенли Б. Липпман Жози Лажойе Барбара Э. Му • Узнайте, как использовать новые средства языка С++11 и стандартной библиотеки для быстрого создания надежных программ, а также ознакомьтесь с высокоуровневым программированием
• Учитесь на примерах, в которых показаны передовые стили программирования и методики проектирования
• Изучите принципы и узнайте почему язык С++11 работает именно так
• Воспользуйтесь множеством перекрестных ссылок, способных помочь вам объединить взаимосвязанные концепции и проникнуть в суть
• Ознакомьтесь с современными методиками обучения и извлеките пользу из упражнений, в которых подчеркиваются ключевые моменты, позволяющие избежать проблем
• Освойте лучшие методики программирования и закрепите на практике изученный материал
Исходный код примеров можно загрузить с веб-страницы книги на сайте издательства по адресу: http://www.williamspublishing.com
Язык программирования C++. Пятое издание - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
В этой программе примечательны два момента: поскольку возвращенный функцией end()итератор указывает на элемент, следующий после последнего, для доступа к последнему элементу контейнера применяется декремент полученного итератора. Вторым очень важным моментом является необходимость удостовериться в том, что контейнер cне пуст, перед вызовом функций front()и back()или обращением к значению итераторов, возвращенных функциями begin()и end(). Если контейнер окажется пустым, все выражения в блоке операторов ifбудут некорректны.
Вызов функций front()или back()для пустого контейнера, равно как и использование индекса, выходящего за диапазон существующих элементов, является серьезной ошибкой.
Функции-члены, обращающиеся к элементам в контейнере (т.е. функции front(), back(), at()и индексирование), возвращают ссылки. Если контейнер является константным объектом, возвращается ссылка на константу. Если контейнер не константа, возвращается обычная ссылка, которую можно использовать для изменения значения выбранного элемента:
if (!с.empty()) {
с.front() = 42; // присвоить 42 первому элементу в контейнере с
auto &v = c.back(); // получить ссылку на последний элемент
v = 1024; // изменить элемент в контейнере с
auto v2 = c.back(); // v2 не ссылка; это копия c.back()
v2 = 0; // это не изменит элемент в контейнере с
}
Как обычно, если ключевое слово autoприменяется для определения переменной, сохраняющей значения, возвращаемые одной из этих функций, и эту переменную предстоит использовать для изменения элемента, то определять эту переменную следует как ссылочный тип.
Контейнеры, предоставляющие быстрый произвольный доступ ( string, vector, dequeи array), предоставляют также оператор индексирования (см. раздел 3.3.3). Как уже упоминалось, оператор индексирования получает индекс и возвращает ссылку на элемент в этой позиции контейнера. Индекс не должен выходить за диапазон элементов (т.е. больше или равен 0 и меньше размера контейнера). Допустимость индекса должен обеспечить разработчик; оператор индексирования не проверяет принадлежность индекса диапазону. Использование для индекса значения вне диапазона является серьезной ошибкой, но компилятор ее не обнаружит.
Если необходимо гарантировать допустимость индекса, вместо него можно использовать функцию-член at(). Она действует как оператор индексирования, но если индекс недопустим, то она передает исключение out_of_range(см. раздел 5.6):
vector svec; // пустой вектор
cout << svec[0]; // ошибка времени выполнения: вектор svec
// еще не имеет элементов!
cout << svec.at(0); // передает исключение out_of_range
Упражнение 9.23. Какими были бы значения переменных val2, val3и val4, в первой программе данного раздела, если бы функция c.size()возвращала значение 1?
Упражнение 9.24. Напишите программу, которая обращается к первому элементу вектора, используя функции at(), front()и begin(), а также оператор индексирования. Проверьте программу на пустом векторе.
9.3.3. Удаление элементов
Подобно тому, как существует несколько способов добавления элементов в контейнер (исключая array), существует несколько способов их удаления. Функции удаления перечислены в табл. 9.7.
Таблица 9.7. Функции удаления последовательных контейнеров
Эти функции изменяют размер контейнера; они не поддерживаются массивами. Контейнер forward_listобладает специальной версией функции erase(); см. раздел 9.3.4, а функции pop_back()у него нет. Функция pop_front()недопустима для контейнеров vectorи string. |
|
|---|---|
c.pop_back() |
Удаляет последний элемент контейнера c. Результат непредсказуем, если контейнер cпуст. Возвращает void |
c.pop_front() |
Удаляет первый элемент контейнера с. Результат непредсказуем, если контейнер спуст. Возвращает void |
c.erase(p) |
Удаляет элемент, обозначенный итератором p. Возвращает итератор на элемент после удаленного или итератор после конца (off-the-end iterator), если итератор pобозначает последний элемент. Результат непредсказуем, если итератор pуказывает на следующий элемент после последнего |
c.erase(b,е) |
Удаляет диапазон элементов, обозначенных итераторами bи е. Возвращает итератор на элемент после последнего удаленного или после последнего элемента контейнера, если итератор еуказывал на последний элемент |
c.clear() |
Удаляет все элементы контейнера с. Возвращает void |
Функции-члены удаления элементов не проверяют свои аргументы. Разработчик должен сам позаботиться о проверке наличия элементов перед их удалением.
pop_front()и pop_back()Функции pop_front()и pop_back()удаляют, соответственно, первый и последний элементы контейнера. Векторы и строки функциями push_front()и pop_front()не обладают. У контейнера forward_listтакже нет функции pop_back(). Подобно функциям-членам доступа к элементам, эти функции не применимы к пустому контейнеру.
Удалив соответствующий элемент, эти функции возвращают тип void. Если необходимо извлечь элемент, то следует сохранить его значение перед удалением:
while (!ilist.empty()) {
process(ilist.front()); // действия с текущей вершиной списка ilist
ilist.pop_front(); // готово; удалить первый элемент
}
Удаление элементов в любой позиции, кроме начала или конца двухсторонней очереди, объявляет недействительными все итераторы, ссылки и указатели. В векторе и строке недействительными объявляются итераторы, ссылки и указатели на элементы, расположенные после удаленного элемента.
Функции-члены удаления удаляют элемент (элементы) в указанной позиции контейнера. Можно удалить как отдельный элемент, обозначенный итератором, так и диапазон элементов, отмеченных парой итераторов. Обе формы функции erase()возвращают итератор на область после последнего удаленного элемента.
Интервал:
Закладка: