- •2 Часть
- •Источники информации
- •1.2 Введение вStl
- •1.2.1 Обзор библиотеки
- •1.2.2 Базовые понятия
- •2 Контейнеры
- •2.1 Простые контейнеры
- •2.1.1 Пара (Pair/Tuple)
- •2.2 Контейнеры с последовательным доступом
- •2.2.1 Вектор (vector)
- •2.2.2 Список (list)
- •2.2.3Forward_list
- •2.2.4 Очередь двухсторонняя (deque)
- •2.3 Контейнеры-адаптеры
- •2.3.1 Очередь односторонняя (queue)
- •2.3.2 Очередь с приоритетами (priority queue)
- •2.3.3 Стек (stack)
- •2.4 Контейнеры с доступом к случайным элементам
- •2.4.1 Упорядоченное множество элементов (set)
- •2.4.2Multiset
- •2.4.3 Словарь (map)
- •2.4.4Multimap
- •3 Итераторы
- •4 Алгоритмы
- •4.1 Не модифицируют коллекцию
- •4.1.1 All_of / any_of / none_of
- •4.1.2For_each
- •4.1.3 Find / find_if / find_if_not / find_end / find_first_of
- •4.1.4Count/count_if
- •4.2.2Move/move_backward
- •4.4.2Partial_sort/partial_sort_copy
- •6 БудущееStl
- •7 Наследование и работа с памятью вStl
2.4.2Multiset
То же самое, что и set, только элементы могут повторяться. Редко используется.
2.4.3 Словарь (map)
Словарь состоит из пар значений «ключ»-«значение». Например, «apple»-«яблоко». Набор ключей уникален, упорядочен, чтобы обеспечить быстрый доступ.
Словари часто используются, когда нужно организовать доступ к элементам коллекции по другому полю. Например, у вас приложение – адресная книга. В ней нужно по имени человека получить его контактную информацию. Контактная информация – какой-то класс. Доступ к контактам планируется только по имени. Тогда можно данные как-то так: map<string,ContactInformation>.
Идея за словарем: вместо индекса, по которому мы обращаемся к данным в массиве, использовать другой тип, чтобы обращаться к элементам массива.
Пример
#include "stdafx.h"
#include <set>
#include <iostream>
#include <algorithm>
#include <iterator>
#include <string>
#include <map>
#include <sstream>
using namespace std;
struct ContactInformation
{
string FirstName;
int Age;
string Address;
string Phone;
ContactInformation(
const string& firstName,
int age,
const string& address,
const string& phone) : FirstName(firstName), Age(age), Address(address), Phone(phone)
{
}
ContactInformation() // Required by map to return elements
: FirstName("Unknown"), Age(5), Address("Unknown"), Phone("23232323")
{
}
string ToString() const
{
stringstream stream;
stream << "First name: " << FirstName << "; Age: " << Age << "; Address: " << Address << "; Phone: " << Phone << ".";
return stream.str();
}
};
map<string, ContactInformation> CreateContacts()
{
map<string, ContactInformation> contacts;
contacts["Barbara"] = ContactInformation("Barbara", 13, "Ivanovo", "22323");
contacts["Ahmed"] = ContactInformation("Ahmed", 40, "Istanbul", "44333");
return contacts;
}
void PrintContacts(const map<string, ContactInformation>& contacts)
{
cout << "Contacts\n";
for (auto contactIterator = contacts.begin(); contactIterator != contacts.end(); ++contactIterator)
{
cout << "Key: " << contactIterator->first << endl;
cout << "Information: " << contactIterator->second.ToString() << endl;
}
// Second more better approach
for (const auto &contactPair: contacts)
{
cout << "Key: " << contactPair.first << endl;
cout << "Information: " << contactPair.second.ToString() << endl;
}
}
int _tmain(int argc, _TCHAR* argv[])
{
map<string, ContactInformation> contacts = CreateContacts();
// add
PrintContacts(contacts);
// check if key exists
if (contacts.count("Barbara") == 1) // check if element exists
cout << "Barbara exists\n";
// delete
contacts.erase("Barbara");
// modify
contacts["Ahmed"].Address = "USA";
PrintContacts(contacts);
getchar();
return 0;
}
2.4.4Multimap
Словарь, в котором могут существовать пары значений с одинаковым ключом. Не используется.
2.4.5 unordered_set, unordered_multiset, unordered_map, unordered_multimap
Хранят данные без сортировки в хэш-таблицах вместо бинарных деревьев. Если не требуется хранить данные в отсортированном виде, то следует предпочитать вместо set–unordered_set, вместоmap–unordered_map.
2.5 Другие типы контейнеров
2.5.1bitset
Эффективно хранит набор бит, предоставляет доступ к индивидуальным битам. Предполагаю, использовался для взаимодействия с устройствами. Редко используется.
2.5.2valarray
Устарел. Не используется.
2.6 Как работаетpush_backвvector. Новый методemplace_back
У вектора есть 2 понятия: вместимость capacityи текущий размерsize. Покаcapacity>sizepush_backдобавляет элементы в конец коллекции. Когда элементов коллекции перестает хватать, он создает массив большего размера, копирует туда данные, только потом добавляет данные.
Поскольку иногда приходится создавать временную копию объекта при добавлении в массив элемента (presidents.push_back(President(“Alexander”))), добавили возможность явно передавать аргументы для конструктора сущности, а сам конструктор уже в внутри метода вызывать.Emplace_back(presidents.emplace_back(“Alexander”)): вызовется на свободном кусочке памяти конструктор с переданными таким способом аргументами: временный объект не будет создаваться.