Стенли Липпман - Язык программирования C++. Пятое издание
- Название:Язык программирования C++. Пятое издание
- Автор:
- Жанр:
- Издательство:Издательский дом Вильямс
- Год:2014
- Город:Москва
- ISBN:978-5-8459-1839-0
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Стенли Липпман - Язык программирования C++. Пятое издание краткое содержание
Вы держите в руках новое издание популярного и исчерпывающего бестселлера по языку программирования С++, которое было полностью пересмотрено и обновлено под
. Оно поможет вам быстро изучить язык и использовать его весьма эффективными и передовыми способами. В соответствии с самыми передовыми и современными методиками изложения материала авторы демонстрируют использование базового языка и его стандартной библиотеки для разработки эффективного, читабельного и мощного кода.
С самого начала этой книги читатель знакомится со стандартной библиотекой С++, ее самыми популярными функциями и средствами, что позволяет сразу же приступить к написанию полезных программ, еще не овладев всеми нюансами языка. Большинство примеров из книги было пересмотрено так, чтобы использовать новые средства языка и продемонстрировать их наилучшие способы применения. Эта книга — не только проверенное руководство для новичков в С++, она содержит также авторитетное обсуждение базовых концепций и методик языка С++ и является ценным ресурсом для опытных программистов, особенно желающих побыстрей узнать об усовершенствованиях С++11.
Стенли Б. Липпман Жози Лажойе Барбара Э. Му • Узнайте, как использовать новые средства языка С++11 и стандартной библиотеки для быстрого создания надежных программ, а также ознакомьтесь с высокоуровневым программированием
• Учитесь на примерах, в которых показаны передовые стили программирования и методики проектирования
• Изучите принципы и узнайте почему язык С++11 работает именно так
• Воспользуйтесь множеством перекрестных ссылок, способных помочь вам объединить взаимосвязанные концепции и проникнуть в суть
• Ознакомьтесь с современными методиками обучения и извлеките пользу из упражнений, в которых подчеркиваются ключевые моменты, позволяющие избежать проблем
• Освойте лучшие методики программирования и закрепите на практике изученный материал
Исходный код примеров можно загрузить с веб-страницы книги на сайте издательства по адресу: http://www.williamspublishing.com
Язык программирования C++. Пятое издание - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Эта стратегия резервирования существенно эффективней таковой при каждой необходимости добавления нового элемента. Фактически ее производительность настолько высока, что на практике вектор обычно растет эффективней, чем список или двухсторонняя очередь, хотя вектор должен еще перемещать свои элементы при каждом повторном резервировании памяти.
Типы vectorи stringпредоставляют описанные в табл. 9.10 функции-члены, позволяющие взаимодействовать с частью реализации, относящейся к резервированию памяти. Функция capacity()сообщает количество элементов, которое контейнер может создать прежде, чем ему понадобится занять больший объем памяти. Функция reserve()позволяет задать количество резервируемых элементов.
Таблица 9.10. Управление размером контейнера
Функция shrink_to_fit()допустима только для контейнеров vector, stringи deque. Функции capacity()и reserve()допустимы только для контейнеров vectorи string. |
|
|---|---|
c.shrink_to_fit() |
Запрос на уменьшение емкости в соответствии с размером |
c.capacity() |
Количество элементов, которое может иметь контейнер спрежде, чем понадобится повторное резервирование |
c.reserve(n) |
Резервирование места по крайней мере для nэлементов |
Функция reserve()не изменяет количество элементов в контейнере; она влияет только на объем памяти, предварительно резервируемой вектором.
Вызов функции reserve()изменяет емкость вектора, только если требуемое пространство превышает текущую емкость. Если требуемый размер больше текущей емкости, функция reserve()резервирует по крайней мере столько места, сколько затребовано (или несколько больше).
Если требуемый размер меньше или равен существующей емкости, функция reserve()ничего не делает. В частности, вызов функции reserve(), при размере меньшем, чем емкость, не приведет к резервированию контейнером памяти. Таким образом, после вызова функции reserve()емкость будет больше или равна переданному ей аргументу.
В результате вызов функции reserve()никогда не сократит объем контейнера. Точно так же функция-член resize()(см. раздел 9.3.5) изменяет только количество элементов контейнера, а не его емкость. Функцию resize()нельзя использовать для сокращения объема память, которую контейнер держит в резерве.
В новой библиотеке есть функция shrink_to_fit(), позволяющая запросить контейнеры deque, vectorили stringосвободить неиспользуемую память. Вызов этой функции означает, что никакой резервной емкости больше не нужно. Однако реализация имеет право проигнорировать этот запрос. Нет никакой гарантии, что вызов функции shrink_to_fit()освободит память.
capacity()и size()Очень важно понимать различие между емкостью (capacity) и размером (size). Размер — это количество элементов, хранящихся в контейнере в настоящий момент, а емкость — это количество элементов, которое контейнер может содержать, не прибегая к следующей операции резервирования памяти. Следующий код иллюстрирует взаимосвязь размера и емкости:
vector ivec;
// размер нулевой; емкость зависит от реализации
cout << "ivec: size: " << ivec.size()
<< " capacity: " << ivec.capacity() << endl;
// присвоить вектору ivec 24 элемента
for (vector::size_type ix = 0; ix != 24; ++ix)
ivec.push_back(ix);
// размер 24; емкость равна или больше 24, согласно реализации
cout << "ivec: size: " << ivec.size()
<< " capacity: " << ivec.capacity() << endl;
При запуске на компьютере автора эта программа отобразила следующий результат:
ivec: size: 0 capacity: 0
ivec: size: 24 capacity: 32
Как известно, пустой вектор имеет нулевой размер, вполне очевидно, что библиотека для пустого вектора также устанавливает нулевую емкость. При добавлении элементов в вектор его размер составляет количество добавленных элементов. Емкость будет, по крайней мере совпадать с размером, но может быть и больше. Конкретный объем резервной емкости зависит от реализации библиотеки. В данной конкретной реализации добавление 24 элементов по одному приводит к созданию емкости 32.
Визуально текущее состояние вектора ivecможно представить так:
Теперь при помощи функции reserve()можно зарезервировать дополнительное пространство.
ivec.reserve(50); // задать емкость 50 элементов (можно и больше)
// размер будет 24, а емкость - 50 или больше, если так определено
// в реализации
cout << "ivec: size: " << ivec.size()
<< " capacity: " << ivec.capacity() << endl;
Вывод свидетельствует о том, что вызов функции reserve()зарезервировал именно столько места, сколько было запрошено:
ivec: size: 24 capacity: 50
Эту резервную емкость можно впоследствии израсходовать следующим образом:
// добавить элементы, чтобы исчерпать резервную емкость
while (ivec.size() != ivec.capacity())
ivec.push_back(0);
// емкость не изменилась, размер и емкость теперь равны
cout << "ivec: size: " << ivec.size()
<< " capacity: " << ivec.capacity() << endl;
Результат свидетельствует, что в настоящий момент резервная емкость исчерпана, а размер и емкость равны.
ivec: size: 50 capacity: 50
Поскольку использовалась только резервная емкость, в повторном резервировании нет никакой потребности. Фактически, пока не превышена существующая емкость вектора, никакой необходимости в перераспределении его элементов нет.
Если теперь добавить в вектор новый элемент, то последует повторное резервирование памяти.
ivec.push_back(42); // добавить еще один элемент
// размер будет 51, а емкость 51 или больше, если так определено
// в реализации
cout << "ivec: size: " << ivec.size()
<< " capacity: " << ivec.capacity() << endl;
Результат выполнения этой части программы имеет следующий вид:
ivec: size: 51 capacity: 100
Он свидетельствует о том, что в данной реализации класса vectorиспользована стратегия удвоения текущей емкости при каждом резервировании новой области памяти.
По мере необходимости можно вызвать функцию shrink_to_fit(), запрашивающую освобождение и возвращение операционной системе памяти, ненужной для текущего размера контейнера:
ivec.shrink_to_fit(); // запрос на возвращение памяти
Интервал:
Закладка: