Д. Стефенс - C++. Сборник рецептов

Тут можно читать онлайн Д. Стефенс - C++. Сборник рецептов - бесплатно полную версию книги (целиком) без сокращений. Жанр: comp-programming, издательство КУДИЦ-ПРЕСС, год 2007. Здесь Вы можете читать полную версию (весь текст) онлайн без регистрации и SMS на сайте лучшей интернет библиотеки ЛибКинг или прочесть краткое содержание (суть), предисловие и аннотацию. Так же сможете купить и скачать торрент в электронном формате fb2, найти и слушать аудиокнигу на русском языке или узнать сколько частей в серии и всего страниц в публикации. Читателям доступно смотреть обложку, картинки, описание и отзывы (комментарии) о произведении.
  • Название:
    C++. Сборник рецептов
  • Автор:
  • Жанр:
  • Издательство:
    КУДИЦ-ПРЕСС
  • Год:
    2007
  • Город:
    Москва
  • ISBN:
    5-91136-030-6
  • Рейтинг:
    3.9/5. Голосов: 101
  • Избранное:
    Добавить в избранное
  • Отзывы:
  • Ваша оценка:
    • 80
    • 1
    • 2
    • 3
    • 4
    • 5

Д. Стефенс - C++. Сборник рецептов краткое содержание

C++. Сборник рецептов - описание и краткое содержание, автор Д. Стефенс, читайте бесплатно онлайн на сайте электронной библиотеки LibKing.Ru

Данная книга написана экспертами по C++ и содержит готовые рецепты решения каждодневных задач для программистов на С++. Один из авторов является создателем библиотеки Boost Iostreams и нескольких других библиотек C++ с открытым исходным кодом. В книге затрагивается множество тем, вот лишь некоторые из них: работа с датой и временем; потоковый ввод/вывод; обработка исключений; работа с классами и объектами; сборка приложений; синтаксический анализ XML-документов; программирование математических задач. Читатель сможет использовать готовые решения, а сэкономленное время и усилия направить на решение конкретных задач.

C++. Сборник рецептов - читать онлайн бесплатно полную версию (весь текст целиком)

C++. Сборник рецептов - читать книгу онлайн бесплатно, автор Д. Стефенс
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

wedInGerman = strMap["Wednesday"];

В манере всех стандартных контейнеров значение, связанное с ключом "Wednesday", с помощью operator=копируется в объект wedInGerman.

operator[]— это удобный способ вставки или обновления элементов или получения значений из map, но он имеет побочный эффект, который может оказаться неожиданным. Строго говоря, operator[k]возвращает ссылку на значение, ассоциированное с k— независимо от того, существует ли kв mapили нет. Если kуже находится в map, то возвращается ассоциированное с ним значение. Если нет, то kвставляется, а затем используется конструктор по умолчанию, который создает объект значения для этого ключа. Чтобы сделать это более понятным, рассмотрим, что делает следующий код.

map mapZipCodes; // Сейчас здесь ноль элементов

string myZip = mapZipCodes["Tempe"]; // В map пока что нет элементов,

// но чему теперь равно count()?

Что находится в myZipи сколько теперь элементов в mapZipCodes? Так как operator[]вставляет указанный ключ, если он не существует, myZipсодержит пустую строку, а в mapZipCodesсодержится один элемент. Это может оказаться нежелательно, но независимо от вашего желания помните, что operator[]не является const-методом: всегда есть вероятность того, что он изменит состояние map, добавив узел.

Метод insertпредоставляет альтернативный метод добавления пар в отображение, insertвыполняет строгую вставку, а не вставку/обновление, как operator[]. При использовании map (но не multimap, который может содержать дублирующиеся ключи) insert, если ключ уже существует, не делает ничего. По сравнению с ним operator[], если ключ уже существует, заменяет значение объекта для этого ключа на новое.

Но синтаксис вставки требует несколько большей работы, чем operator[], и он связан с тем, как mapхранит данные. Рассмотрим строку из примера 6.6.

strMap.insert(std::make_pair("Sunday", "Sonntag"));

ma pхранит пары ключ/значение в объекте pair, pair— это простой вспомогательный шаблон класса (объявленный в и включенный в ), который хранит два значения двух типов. Чтобы объявить pairиз двух string, сделайте так.

pair myPair;

Первый и второй элементы в pairдоступны по открытым членам firstи second. При использовании для доступа к элементам mapоператора operator[]обычно работать с pairне приходится, но в случае со многими другими методами это придется делать, так что следует знать, как создавать и использовать объекты pair. Например, итераторы разыменовываются в простые объекты pair, так что при их использовании, как это делается в примере 6.6, следует знать, как получить ключ и его значение.

for (map iterator p = strMap.begin();

p != strMap.end(); ++p)

cout << "English: " << p->first

<< ", German: " << p->second << endl;

Ключ хранится в first, а значение хранится в second.

Однако это не объясняет, почему я использовал make_pair. make_pair— это вспомогательный шаблон функции, который создает объект pairна основе двух переданных в него аргументов. Некоторые предпочитают этот подход вызову конструктора pair, так как шаблон класса не может догадаться о типах своих аргументов, в то время как шаблон функции может. Таким образом, эти две строки кода функционально эквивалентны.

strMap.insert(std::make_pair("Sunday", "Sonntag"));

strMap.insert(std::pair("Sunday", "Sonntag"));

mapне допускает наличия дублирующихся ключей. Если требуется разрешить дублирование ключей, следует использовать multimap, который является map, разрешающим наличие несколько одинаковых ключей. Его интерфейс идентичен map, но поведение методов в необходимых случаях отличается. В табл. 6.1 приведен перечень методов, которые есть в одном, но отсутствуют в другом, и пояснения различий в поведении общих методов, map и multimapсодержат несколько typedef, которые описывают различные значения, хранящиеся в них. В табл. 6.1 они используются следующим образом:

key_type

Это тип ключа. В string map,объявленном как map, key_typeдолжен быть string.

mapped_type

Это тип значения, на которое отображается ключ. В string map, объявленном как map, mapped_typeдолжен быть MyClass*.

value_type

Это тип объекта, содержащего ключ и значение, которой, применительно к mapи multimap, является pair.

Табл. 6.1. map и multimap

Метод map, multimap или оба Поведение
T& operator[] (const key_type& k) map Возвращает ссылку на объект значения, сохраненный с ключом k. Если kв map отсутствует, то он добавляется, а объект значения создается с помощью конструктора по умолчанию
iterator insert(const value_type& v) pair insert(const value_type& v) Оба Первая версия вставляет vв multimapи возвращает итератор, который указывает на вставленную пару pair. Вторая версия вставляет vи mapпри условии, что в mapеще не содержится ключа, равного v. Возвращаемая pairсодержит итератор который указывает на вставленную pair, если произошла вставка, и bool, указывающий, была ли вставка успешной
iterator find(const key_type& k) Оба Возвращает итератор или const_iterator, который указывает на mapped_type, соответствующий k. В multimapне гарантируется, что возвращаемый итератор будет указывать на первое значение, соответствующее k. Если ключа, равного k, нет, то возвращаемый итератор равен end()

Также табл 6.1 показывает разницу в поведении между mapи multimap.

Если operator[]вам не подходит, т.е. другой способ найти ключ в map. Для этого можно использовать метод find.

map::const_iterator p

= strMap.find("Thursday");

if (p != strMap.end())

cout << "Thursday = " << p->second << endl;

Но не забудьте, что при использовании multimapне гарантируется, что возвращаемый элемент будет первым элементом с ключом, равным искомому. Если нужен первый элемент, чей ключ не меньше определенного значения или не больше определенного значения, используйте lower_boundили upper_bound. lower_boundвозвращает итератор, указывающий на первую пару ключ/значение, равную или большую, чем аргумент key_type. Другими словами, если ваш mapсодержит дни недели, как в примере 6.6, следующий код вернет итератор, который указывает на пару, содержащую "Friday"и "Freitag".

p = strMap.lower_bound("Foo");

if (p != strMap.end())

cout << p->first << " = " << p->second << endl;

Это происходит благодаря тому, что первый ключ больше или равен "Foo". upper_boundработает аналогично, но с противоположным условием.

Читать дальше
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать


Д. Стефенс читать все книги автора по порядку

Д. Стефенс - все книги автора в одном месте читать по порядку полные версии на сайте онлайн библиотеки LibKing.




C++. Сборник рецептов отзывы


Отзывы читателей о книге C++. Сборник рецептов, автор: Д. Стефенс. Читайте комментарии и мнения людей о произведении.


Понравилась книга? Поделитесь впечатлениями - оставьте Ваш отзыв или расскажите друзьям

Напишите свой комментарий
x