Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
КП - 2 часть - Лекция 4. STL.docx
Скачиваний:
12
Добавлен:
11.05.2015
Размер:
134.67 Кб
Скачать

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”)): вызовется на свободном кусочке памяти конструктор с переданными таким способом аргументами: временный объект не будет создаваться.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]