Главная страница

Основные элементы языка программирования Си алфавит, идентификаторы, ключевые слова, константы


Скачать 0.78 Mb.
НазваниеОсновные элементы языка программирования Си алфавит, идентификаторы, ключевые слова, константы
Дата04.03.2022
Размер0.78 Mb.
Формат файлаdocx
Имя файлаAYa.docx
ТипДокументы
#382846
страница6 из 7
1   2   3   4   5   6   7

34.Стандартная библиотека шаблонов (STL), назначение библиотеки, основные компоненты библиотеки (контейнеры, итераторы, алгоритмы).
Стандартная библиотека шаблонов (STL – standard template library) - ядро стандартной библиотеки языка Си++. Все компоненты библиотеки шаблоны классов, шаблоны позволяют внутри себя использовать любые типы данных (с некоторыми ограничениями).

Компоненты библиотеки
• Контейнеры;
• Итераторы;
• Алгоритмы.
Контейнеры используются для управления коллекциями объектов определенного типа
(массивы, вектора, списки очереди, множества, хеш-таблицы и т.п.).
Итераторы используются для обхода элементов в контейнерах.
Алгоритмы (это глобальные функции библиотеки) используются для обработки
элементов контейнеров (сортировка, поиск, модификация и др.).
В некотором смысле концепция библиотеки противоречит исходной идеи ООП:
отделяет данные от алгоритмов, а не объединяет их.
35.Контейнеры стандартной библиотеки шаблонов (STL), классификация.

Контейнеры
1. Последовательные контейнеры - упорядоченные коллекции, в которых каждый
элемент занимает определенную позицию. Позиция зависит от времени и места вставки, но не
зависит от значения элемента.

Шаблоны классов: array, vector, deque, list, forward_list (стандарт С++ 11).


2. Упорядоченные (ассоциативные) контейнеры - позиция элемента зависит от его значения (или ключа, если элемент представляет собой пару «ключ-значение»).
Шаблоны классов: set, multiset, map, multimap.

3. Неупорядоченные контейнеры – позиция элемента не имеет значение.
Шаблоны классов: unordered_set, unordered_multiset, unordered_map,
unordered_multimap

Некоторые общие свойства контейнеров

Определения типов (typedefs):
reference - предоставляет ссылку на элемент, хранящийся в контейнере.
iterator - предоставляет итератор произвольного доступа, который может читать или
изменять любой элемент в контейнере.
reverse_iterator - итератор для перемещения в обратном контейнере.
value_type - представляет тип данных, хранящихся в контейнере.
Методы:
at - возвращает ссылку на элемент в заданном положении в контейнере по индексу (array,
vector, deque).
begin - возвращает итератор, указывающий на первый элемент (cbegin константный итератор)
end (cend)- возвращает итератор произвольного доступа, который указывает на конец
контейнера.
rbegin - возвращает итератор, указывающий на первый элемент в обратном контейнере.
rend - возвращает итератор, который указывает на последний элемент в обратном контейнере.
size - возвращает количество элементов в контейнере (кроме односвязного списка).
resize – устанавливает новый размер контейнера.
swap - меняет местами элементы двух контейнеров.
clear – очистка контейнера (кроме array).
empty – проверяет является контейнер пустой или нет.


Перегруженные операции:
operator!= operator< operator<= operator==operator> operator>= operator[] (длямассива, вектораидека).

operator = ??????????

36.Особенности последовательных контейнеров: vector, deque, list.

Последовательные контейнеры
Шаблон класса vector (Вектор)
Вектор управляет элементами, хранящимися в динамическом массиве. Он обеспечивает
произвольный доступ к элементам, т.е. к каждому элементу можно обратиться напрямую по соответствующему индексу. Добавление и удаление элементов происходит в конце массива и выполняется, как правило, быстро. Вставка элемента в середину или в начало массива занимает достаточно много времени, т.к. требуется перемещать остальные элементы.
Специальные методы vector:
capacity - Возвращает число элементов, которое вектор может содержать без выделения
дополнительного пространства.
insert - Вставляет элемент или некоторое число элементов в вектор с заданной позиции.
pop_back - Удаляет элемент в конце вектора.
push_back - Добавляет элемент в конец вектора.

Шаблон класса list:

Реализован как двухсвязный список элементов.
Некоторые дополнительные методы:
back - Возвращает ссылку на последний элемент в списке.
erase - Удаляет элемент или диапазон элементов с указанных положений в списке.
front - Возвращает ссылку на первый элемент в списке.
insert - Вставляет элемент или количество элементов или диапазон элементов в указанное
положение в списке.
pop_back - Удаляет элемент в конце списка.
pop_front - Удаляет элемент в начале списка.
push_back - Добавляет элемент в конец списка.
push_front - Добавляет элемент в начало списка.
remove - Удаляет из списка элементы, совпадающие с заданным значением.
reverse - Изменяет порядок следования элементов в списке на обратный.
sort - Упорядочивает элементы списка.

Пример на list:


#include
#include
#include

using namespace std;

int main() {
list coll; // Список элементов типа char
// Добавляет элементы в список
for (char c = 'a'; c <= 'z'; ++c) {
coll.push_back(c);
}
coll.reverse(); // Переписываем элементы в обратном порядке
// Печать всех элементов
for (auto elem: coll) {
cout << elem << ' ';
}
cout << endl;
coll.sort();
// Очистка списка
while (!coll.empty()) {
cout << coll.front() << ' ';
coll.pop_front();
}
cout << endl;
}

Шаблон класса deque:
Дек (deque) (от double-ended queue - двусторонняя очередь). Дек – динамический
массив, реализованный таким образом, что он может расти в обоих направлениях. Вставка элемента в конец или начало выполняется быстро, вставка в середину медленнее, так как надо сдвигать другие элементы.

Пример на deque:


#include
#include

using namespace std;

int main() {
deque coll; // Создаем объект (пустой)
// Добавляем элементы
for (int i = 1; i <= 10; ++i) {
if (i % 2) coll.push_front(i * 1.1); // В начало
else coll.push_back(i * 10.1); // В конец
}
// Печать всех элементов
for (int i = 0; i < coll.size(); ++i) {
cout << coll[i] << ' ';
}
cout << endl;
}

37.Особенности контейнеров стандартной библиотеки шаблонов (STL) std::set и std::multiset.


  1. Множество (шаблон set) - контейнер в котором элементы сортируются в
    соответствии со своими значениями, дубликаты не допускаются.


#include
#include

using namespace std;

void main() {
// Множество целых чисел
set coll;
// Добавляем элементы
// - Дважды добавляется элемент со значением 1
coll.insert(3);
coll.insert(1);
coll.insert(5);
coll.insert(4);
coll.insert(1); // Второе добавление 1 не работает
coll.insert(6);
coll.insert(2);
// Печать всех элементов
for (auto pos: coll) {
std::cout << pos << ' ';
}
cout << endl;
}


  1. Мультимножество (шаблон multiset) – множество, в котором разрешены дубликаты.


#include
#include
#include

using namespace std;

void main() {
// Множество объектов string
multiset cities{
"Braunschweig", "Hanover", "Frankfurt", "New York",
"Chicago", "Toronto", "Paris", "Frankfurt"
};
// Печать всех элементов
for (const auto &elem: cities) {
cout << elem << " ";
}
cout << endl;
// Добавление новых элементов
cities.insert({"London", "Munich", "Hanover", "Braunschweig"});
// Печать всех элементов
for (const auto &elem: cities) {
cout << elem << " ";
}
cout << endl;
}

Основные методы: insert - вставляет элемент или диапазон элементов. erase -
удаляет элемент или диапазон элементов. find - возвращает итератор, который обращается к
местоположению элемента в наборе с ключом.

38.Особенности контейнеров стандартной библиотеки шаблонов (STL) std::map и std::multimap.

  1. Карта (отображение) (шаблон map) – содержит пары «ключ-значение», ключ
    используется для сортировки, дубликаты ключей запрещены.

  2. Мультикарта (мультиотображение) (шаблон multimap) – карта в которой разрешены дубликаты.


#include
#include
#include

using namespace std;

void main() {
multimap coll = {{5, "tagged"}, // Контейнер для int/string значений (первый элемент задает ключ)
{2, "a"},
{1, "this"},
{4, "of"},
{6, "strings"},
{1, "is"},
{3, "multimap"}};
int key = 128;
string str = "World!!";
// Печать всех элементов
for (auto elem: coll) {
cout << elem.first << ' ' << elem.second << endl;
}
cout << endl;
// Добавляем элементы
coll.insert({3, "Hello"});
coll.insert({key, str});
// Печать всех элементов
for (auto elem: coll) {
cout << elem.first << ' ' << elem.second << endl;
}
cout << endl;
coll.erase(3); // Удалить элементы с ключом 3
for (auto elem: coll) {
cout << elem.first << ' ' << elem.second << endl;
}
}

39.Особенности контейнеров стандартной библиотеки шаблонов (STL) std::unordered_set и std:: unordered_multiset.

Неупорядоченные контейнеры
Порядок элементов не важен он может изменяться после добавления или удаления.
Шаблоны классов: unordered_set, unordered_multiset, unordered_map,
unordered_multimap.

Основные функции аналогичны упорядоченным контейнерам.
Пример:


#include
#include
#include

using namespace std;

void main() {
unordered_multimap coll = {
{5, "tagged"}, // Контейнер для int/string значений (первый элемент задает ключ)
{2, "a"},
{1, "this"},
{4, "of"},
{6, "strings"},
{1, "is"},
{3, "multimap"}};
int key = 128;
string str = "World!!";
// Печать всех элементов
for (auto elem: coll) {
cout << elem.first << ' ' << elem.second << endl;
}
cout << endl;
// Добавляем элементы
coll.insert({3, "Hello"});
coll.insert({key, str});
// Печать всех элементов
for (auto elem: coll) {
cout << elem.first << ' ' << elem.second << endl;
}
cout << endl;
coll.erase(3); // Удалить элементы с ключом 3
for (auto elem: coll) {
cout << elem.first << ' ' << elem.second << endl;
}
}

40.Особенности контейнеров стандартной библиотеки шаблонов (STL) unordered_map и unordered_multimap

Класс unordered_map реализует ассоциативный массив, в котором каждому ключу соответствует одно значение. Чтобы получить доступ к элементу, необходимо указать ключ, который использовался при сохранении элемента. В отличии от класса map для быстрого поиска элементов используется хеш-таблица, значения которой состоят из целых чисел (тип size_t). Класс unordered_multimap реализует ассоциативный массив, в котором одному ключу могут соответствовать несколько значений.

Неупорядоченные контейнеры – позиция элемента не имеет значение. Шаблоны классов: unordered_set, unordered_multiset, unordered_map, unordered_multimap.

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

Основные функции аналогичны упорядоченным контейнерам.

Пример:

#include
#include
#include

using namespace std;

void main() {
unordered_multimap coll = {
{5, "tagged"}, // Контейнер для int/string значений (первый элемент задает ключ)
{2, "a"},
{1, "this"},
{4, "of"},
{6, "strings"},
{1, "is"},
{3, "multimap"}};
int key = 128;
string str = "World!!";
// Печать всех элементов
for (auto elem: coll) {
cout << elem.first << ' ' << elem.second << endl;
}
cout << endl;
// Добавляем элементы
coll.insert({3, "Hello"});
coll.insert({key, str});
// Печать всех элементов
for (auto elem: coll) {
cout << elem.first << ' ' << elem.second << endl;
}
cout << endl;
coll.erase(3); // Удалить элементы с ключом 3
for (auto elem: coll) {
cout << elem.first << ' ' << elem.second << endl;
}
}

41.Итераторы стандартной библиотеки шаблонов (STL), операции с итераторами, пример использования итератора

Итератор – объект, который хранит позицию элемента в контейнере. С помощью

итератора можно перебирать все элементы в контейнере.

Перегруженные операции в шаблоне:

* возвращает элемент, стоящий в текущей позиции;

++ -- перемещает итератор на следующий или предыдущий элемент;

== != проверяем представляют ли 2 итератора одну и ту же позицию;

= присваивание итератора.

Пример:

#include
#include

using namespace std;

int main() {
list coll; // Список элементов типа char
// Добавляет элементы в список
for (char c = 'a'; c <= 'z'; ++c) {
coll.push_back(c);
}
// Печать всех элементов в прямом порядке
list::iterator pos;
for (pos = coll.begin(); pos != coll.end(); ++pos)
cout << *pos << ' ';
cout << endl;
// Печать всех элементов в обратном порядке
list::reverse_iterator pos2;
for (pos2 = coll.rbegin(); pos2 != coll.rend(); ++pos2)
cout << *pos2 << ' ';
cout << endl;
}

42.Алгоритмы стандартной библиотеки шаблонов (STL), пример использования алгоритма для поиска элемента в контейнере на примере find.

Алгоритмы обеспечивают основные операции, такие как, поиск, сортировка,

копирование, переупорядочение, модификация и численные расчеты.

Алгоритмы представляют собой глобальные функции, работающие с итераторами.

Алгоритм может работать с контейнерами разных типов.

// Поиск минимального элемента

auto minpos = min_element(coll.cbegin(), coll.cend());

// Поиск максимального элемента

auto maxpos = max_element(coll.cbegin(), coll.cend());

// Сортировка всех элементов

sort(coll.begin(), coll.end());

// Поиск первого элемента со значением 3

auto pos3 = find(coll.begin(), coll.end(), 3);

// Переписываем в обратном порядке все элементы,

// начиная с 3 до конца вектора

reverse(pos3, coll.end());

Пример:

#include
#include
#include
#include

using namespace std;

int main() {
// Создать вектор
vector coll = {2, 5, 4, 1, 6, 3, 10, 15, 8, 6};
// Поиск минимального элемента
auto minpos = min_element(coll.cbegin(), coll.cend());
cout << "min: " << *minpos << endl;
// Поиск максимального элемента
auto maxpos = max_element(coll.cbegin(), coll.cend());
cout << "max: " << *maxpos << endl;
// Сортироовка всех элементов
cout << "Sorting:" << endl;
sort(coll.begin(), coll.end());
for (auto elem: coll) {
cout << elem << ' ';
}
cout << endl;
// Поиск первого элемента со значением 3
// - не используем cbegin()/cend() потом, что позже элементы будут модифицированы
auto pos3 = find(coll.begin(), coll.end(), 3); // range value
*pos3 = 333;
// Переписываем в обратном порядке все элементы, начиная с 3 до конца вектора
reverse(pos3, coll.end());
// Печать всех элементов
for (auto elem: coll) {
cout << elem << ' ';
}
cout << endl;
}

43.Использование функций в качестве аргументов алгоритма

стандартной библиотеки шаблонов (STL) на примере функции for_each

Алгоритм (функция) for_each

Первые два параметра задают диапазон контейнера, 3-й параметр указатель на

функцию, которая в качестве параметра получает элемент контейнера.

Пример:

#include
#include
#include

using namespace std;

// function that prints the passed argument
void print(int elem) {
cout << elem << ' ';
}

int main() {
vector coll;
// insert elements from 1 to 9
for (int i = 1; i <= 9; ++i) {
coll.push_back(i);
}
// print all elements
for_each(coll.cbegin(), coll.cend(), // range
print); // operation
cout << endl;
}

44.Предикаты в стандартной библиотеке шаблонов (STL), унарные и бинарные предикаты, пример использования унарного предиката для поиска элементов в контейнере на примере функции find_if
1   2   3   4   5   6   7


написать администратору сайта