Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
САОД_ответы_catsto_NEW.doc
Скачиваний:
17
Добавлен:
16.04.2019
Размер:
365.57 Кб
Скачать

Vint v1, v2(100);

Vint v3(v2.Begin(), --v2.End());

//resize vector

v1.resize(10); //v1.size() == 10

v1.push_back(2); //v1.size() == 11

//assign a vector to another vector

v3 = v1;

//access random element

v[i] = 10;

Отсортировать массив можно функцией STL sort.

//sort vector

Sort(V.Begin(), V.End());

Вектора очень эффективны при доступе к элементам по номеру, но не эффективны при изменении структуры, например, v.erase(v.begin()) (удалить первый элемент массива).

Ассоциативные контейнеры

Ассоциативные контейнеры позволяют хранить и извлекать элементы по ключу. Порядок расположение элементов в контейнере не существенен и не может быть установлен или изменен. Рассмотрим set и map.

Множество(set)

Рассмотрим множество строк. Множество – простейший ассоциативный контейнер, он позволяет хранить только ключ и установить, имеется ли данный ключ во множестве. Множества очень эффективны при поиске элементов по ключу.

//define new type

typedef set<string> SETSTR;

//create set

Setstr s, s2;

//check if set is empty

cout << s.empty() << endl; //true

//add elements

s.insert (“abc”); s.insert (“123”); // s.size() == 2

s2 = s; // s2 == s

//find elements

SETSTR::iterator i = s.find(“abc”); //i != s.end(), *i == “abc”

i = s.find(“efd”); //i == s.end()

//remove elements

s.erase (“abc”); s.erase(s.begin()); // s is empty

Таблицы (отображения)(map)

Отображения – сложнее контейнеров рассмотренных выше. Оно хранит пары (ключ, значение). Рассмотрим отображение строк в целые числа.

//define new type

typedef map<string, int> STR2INT;

//create map

STR2INT m;

//check if map is empty

cout << m.empty() << endl; //true

//add & update elements

m.insert(STR2INT::value_type(“a”,1)); // m.size() == 1

m[“b”] = 2; // m.size() == 2

m[“a”] = 3; // m.size() == 2

//find elements

STR2INT::iterator i = m.find(“a”); // i != m.end(),

// (*i).first == “a”

// (*i).second == 3

for (STR2INT::iterator i= m.begin(); i != m.end(); i++)

cout << i->first << “\t” << i->second << endl;

//remove elements

m.erase(“a”); m.erase(m.begin()); // m is empty

Отображения очень эффективны при поиске элементов по ключу.

  1. Использование контейнеров stl. Методы резервирования памяти контейнерами stl. Требования к элементам контейнеров.

Пример применения контейнеров

Выборка

Изменение структуры

Vector

const

N

List

N/2

const

map

ln(N)

ln(N)

Допустим, нам нужно посчитать количество различных слов, которые поступают с консоли в нашу программу. Предположим, так же, что все они в верхнем регистре, т.е. “Hello” и “HELLO” будут поступать как “HELLO”.

Воспользуемся для решения этой задачи множеством строк.

typedef set<string> SETSTR;

SETSTR c; //Объявили контейнер

string s = … //Читаем слово

while (s != “”){ //пока слово не пусто

C.Insert(s);

s = … //Читаем следующее слово }

cout << c.size() << endl;

Если нужно вывести все различные слова, то

for (SETSTR:: iterator i = c.begin(); i != c.end(); i++)

cout << *i << endl;

Если необходимо посчитать и сколько раз каждое слово встречалось в тексте, то можно использовать map.

typedef map<string, int> STR2INT;

STR2INT m; //Объявили контейнер

string s = … //Читаем слово

while (s != “”){ //пока слово не пусто

m[s]++; // вставить, если не было и увеличить счетчик

s = … //Читаем следующее слово }

cout << m.size() << endl; //количество различных слов

Выводим слова и число их появления в тексте

for (STR2INT:: iterator i = m.begin(); i != m.end(); i++)

cout << i->first << “\t” << i->second << endl;

и другие примеры из вопроса №7.

Требования к элементам контейнеров.

Контейнер может хранить данные разных типов (например: массив целых чисел, массив строк, список строк и т.д.). Для последовательных контейнеров требуется переопределять операции сравнения в случае помещения в контейнер объектов (точнее их копий), но не требуется при работе с указателями на объекты.

Метод

Описание

Примечание

Конструктор копии

Создает новый элемент, идентичный старому

Используется при каждой вставке элемента в контейнер

Оператор присваивания

Заменяет содержимое элемента копией исходного элемента

Используется при каждой модификации элемента

Деструктор

Разрушает элемент

Используется при каждом удалении элемента

Конструктор по умолчанию

Создает элемент без аргументов

Применяется только для определенных операций

Operator «= =»

Проверяет два элемента на равенство

Используется при выполнении operator == для двух контейнеров

Operator «<»

Определяет, меньше ли один элемент другого

Используется при выполнении operator < для двух контейнеров

Методы резервирования памяти контейнерами STL:

Для вектора:

  • Метод reserve резервирует в векторе пространства не меньше заданного, но может выделить и чуть больше запрошенного.

  • Метод resize инициализирует заданное количество элементов в векторе.

  • Метод size возвращает количество элементов в векторе на текущий момент времени.

  • Метод capacity возвращает количество элементов в векторе, под которые зарезервированна память (включая проинициализированные элементы).

Если один раз вызывать reserve(n1), потом еще раз вызывать reserve(n2), то элементов будет не менее, чем n2, а элементы, которые уже были в векторе останутся неизменными (т.е. размер массива не изменится), но могут переместиться в другую область памяти.

Элементы вектора должны располагаться в непрерывном адресном пространстве – это требование. Но распределением и перераспределением памяти занимается аллокатор, и какой кусок он выделит – его личное дело.