Руководство для начинающих по стандартной библиотеке шаблонов в C ++

C ++ – один из самых мощных и устрашающих языков программирования, с которыми вы можете столкнуться как новичок. Причина довольно проста. Для достижения желаемого результата требуется много кода. Стандартная библиотека шаблонов, или STL, может помочь вам решить эту загадку.

Учитывая количество времени и усилий, затрачиваемых на написание кода для таких функций, как сортировка и поиск, STL может помочь вам выполнить все эти операции с помощью всего одной строчки кода. Эта библиотека может быть чрезвычайно полезна для решения проблем и подготовки к техническим собеседованиям.

Что такое стандартная библиотека шаблонов?

Стандартная библиотека шаблонов или STL – это библиотека C ++, состоящая из предварительно созданных функций и контейнеров. Он включает несколько известных шаблонных классов для общих структур данных, таких как векторы, стеки, очереди, и некоторые удобные алгоритмические функции, такие как двоичный поиск, чтобы упростить программирование.

Стандартная библиотека шаблонов в C ++ состоит из четырех компонентов:

  1. Алгоритмы
  2. Контейнеры
  3. Функции
  4. Итераторы

Давайте рассмотрим алгоритмы и контейнеры более подробно, поскольку они являются наиболее часто используемыми компонентами STL.

Алгоритмы в STL

Заголовочный файл <algorithm> является частью STL, состоящей из нескольких алгоритмических функций, которые можно использовать вместо их ручного кодирования. Некоторые из включенных алгоритмов – это двоичный поиск, сортировка и обратный просмотр, которые чрезвычайно полезны.

Для начала вам нужно импортировать заголовок <algorithm> в ваш файл C ++. Синтаксис следующий:

 #include <algorithm>

Для будущих методов рассмотрим в качестве примера переменную массива со значениями {6, 2, 9, 1, 4}.

 int arr[] = {6, 2, 9, 1, 4};

Сортировать()

Функция sort () помогает вам отсортировать все элементы внутри указанной структуры данных в порядке возрастания. Эта функция принимает два параметра: начальный итератор и конечный итератор.

Связанный: Введение в алгоритм сортировки слиянием

Синтаксис:

 sort(start_iterator, end_iterator);

Вот небольшой пример:

 sort(arr, arr+5);
for (int i = 0; i < 5; i++) {
cout << arr[i] << " ";
}

Выход:

 1 2 4 6 9

обеспечить регресс()

Функция reverse () меняет порядок элементов в указанной структуре данных. Он принимает два параметра: начальный итератор и конечный итератор.

Синтаксис:

 reverse(start_iterator, end_iterator);

Вот краткий пример описанного выше метода:

 reverse(arr, arr+5);
for(int i = 0; i < 5; i++) {
cout << arr[i] << " ";
}

Выход:

 4 1 9 2 6

* min_element () и * max_element ()

Функции * max_element () и * min_element () возвращают максимальное и минимальное значение внутри указанной структуры данных соответственно. Обе эти функции принимают два аргумента: начальный итератор и конечный итератор.

Синтаксис:

 *max_element(start_iterator, end_iterator);
*min_element(start_iterator, end_iterator);

Давайте выясним, какие значения возвращают эти функции при их вызове на примере массива:

 cout << *max_element(arr, arr+5) << endl;
cout << *min_element(arr, arr+5) << endl;

Выход:

 9
1

Метод binary_search () используется для определения того, присутствует ли указанное значение внутри структуры данных или нет. Он принимает три аргумента: начальный итератор, конечный итератор и значение, которое вы хотите найти.

Двоичный поиск работает только с отсортированными структурами данных. Следовательно, вам нужно сначала вызвать метод sort () перед методом binary_search () .

Синтаксис:

 binary_search(start_iterator, end_iterator, value_to_find)

Вот демонстрация этого метода:

 sort(arr, arr+5);
binary_search(arr, arr+5, 2) ? cout << "Element found" : cout << "Element not found";
binary_search(arr, arr+5, 7) ? cout << "Element found" : cout << "Element not found";

Выход:

 Element found
Element not found

считать()

Метод count () возвращает количество вхождений указанного значения внутри структуры данных. Он принимает три аргумента: начальный итератор, конечный итератор и значение для подсчета.

Синтаксис:

 count(start_iterator, end_iterator, value_to_count);

Вот пример этого метода:

 cout << count(arr, arr+5, 2) << endl;

Выход:

 1

Контейнеры в STL

Контейнеры – это структуры данных, в которых хранятся объекты и данные. Векторы, списки, стеки, очереди, наборы и карты – вот некоторые из примеров, в которых данные хранятся в соответствии с указанным примитивным типом данных. Вы можете использовать эти контейнеры, импортировав соответствующие заголовки в файл C ++.

При инициализации переменной контейнера необходимо указать примитивные данные, такие как int , char , string, внутри скобок <> .

Давайте рассмотрим некоторые из этих контейнеров более подробно:

Вектор

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

Синтаксис:

 #include <vector>
vector<data_type> variable_name;

Вот несколько важных векторных методов:

  1. push_back (value) : этот метод добавляет данные в вектор.
  2. pop_back () : этот метод удаляет последний элемент из вектора.
  3. insert (index, value) : этот метод вставляет новые элементы перед элементом в указанной позиции.
  4. size () : этот метод возвращает размер вектора.
  5. empty () : этот метод проверяет, является ли вектор пустым или нет.
  6. front () : этот метод возвращает первое значение вектора.
  7. back () : метод back возвращает последнее значение вектора.
  8. at (index) : этот метод возвращает значение в указанной позиции.
  9. erase (index) : метод erase удаляет элементы из данного индекса.
  10. clear () : этот метод очищает все элементы вектора.
 vector < int > v = { 23, 12, 56, 10 };
v.push_back(5);
v.push_back(25);
v.pop_back();
auto i = v.insert(v.begin() + 1, 7);
cout << "The size of the given vector " << v.size() << endl;
if (v.empty()) {
cout << "Vector is empty" << endl;
} else {
cout << "Vector is not empty" << endl;
}
cout << "Element at the first position is " << v.front() << endl;
cout << "Element at the last position is " << v.back() << endl;
cout << "Element at the given position is " << v.at(4) << endl;
v.erase(v.begin() + 1);
for (int i = 0; i < v.size(); i++) {
cout << v[i] << " ";
}

Выход:

 The size of the given vector 6
Vector is not empty
Element at the first position is 23
Element at the last position is 5
Element at the given position is 10
23 12 56 10 5

Очередь

В структуре данных очереди элементы вставляются сзади и удаляются спереди. Следовательно, он следует подходу FIFO («первым пришел – первым ушел»).

Синтаксис:

 #include <queue>
queue<data_type> variable_name;

Вот несколько важных методов очереди:

  1. push (value ): этот метод добавляет элементы в очередь.
  2. pop () : этот метод удаляет первый элемент очереди.
  3. size () : этот метод возвращает размер очереди.
  4. front () : этот метод возвращает первый элемент очереди.
  5. back () : этот метод возвращает последний элемент очереди.
 queue < int > q;
q.push(30);
q.push(40);
q.push(50);
q.push(60);
q.push(70);
cout << "The first element is " << q.front() << endl;
cout << "The last element is " << q.back() << endl;
cout << "The size of queue is " << q.size() << endl;
q.pop();
cout << "Printing all the elements of the Queue" << endl;
while (!q.empty()) {
cout << q.front() << " ";
q.pop();
}

Выход:

 The first element is 30
The last element is 70
The size of the queue is 5
Printing all the elements of the Queue
40 50 60 70

Куча

Контейнеры стека работают по методу LIFO. LIFO означает «последний пришел – первым ушел». Данные отправляются и извлекаются с одного конца.

Синтаксис:

 #include <stack>
stack<data_type> variable_name;

Вот несколько важных методов стека:

  1. push (value ): этот метод помещает элемент в стек.
  2. pop () : этот метод удаляет верхний элемент стека.
  3. top () : этот метод возвращает значение последнего элемента, введенного в стек.
  4. size () : этот метод возвращает размер стека.
  5. empty () : этот метод проверяет, пуст ли стек.
 stack < int > s;
s.push(30);
s.push(40);
s.push(50);
s.push(60);
cout << "The top of the stack contains " << s.top() << endl;
s.pop();
cout << "The top of the stack after performing pop operation: " << s.top() << endl;
cout << "Printing all elements of the stack" << endl;
while (!s.empty()) {
cout << s.top() << " ";
s.pop();
}

Выход:

 The top of the stack contains 60
The top of the stack after performing pop operation: 50
Printing all elements of the stack
50 40 30

Набор

Контейнеры набора используются для хранения уникальных значений, и значение элемента не может быть изменено после того, как он вставлен в набор. Все элементы набора хранятся в отсортированном виде. Контейнер набора аналогичен структуре данных набора в Python .

Синтаксис:

 #include <set>
set<data_type> variable_name;

Вот несколько важных методов набора:

  1. insert (value) : этот метод вставляет элементы в набор.
  2. begin () : этот метод возвращает итератор к первому элементу набора.
  3. end () : этот метод возвращает итератор к последнему элементу набора.
  4. size () : этот метод возвращает размер набора.
  5. empty () : этот метод проверяет, пуст ли набор.
  6. find (значение) : этот метод возвращает итератор к элементу, переданному в параметре. Если элемент не найден, эта функция возвращает итератор в конец набора.
  7. erase (value) : этот метод удалил указанный элемент из набора.
 set < int > s;
s.insert(20);
s.insert(30);
s.insert(40);
s.insert(50);
s.insert(60);
s.insert(60);
s.insert(60);
auto i = s.begin();
cout << "Element at the first position " << * i << endl;
cout << "The size of the set " << s.size() << endl;
s.find(20) != s.end() ? cout << "Element found" << endl : cout << "Element not found" << endl;
s.erase(30);
cout << "Printing all the elements" << endl;
for (auto i = s.begin(); i != s.end(); i++) {
cout << * i << " ";
}

Выход:

 Element at the first position 20
The size of the set 5
Element found
Printing all the elements
20 40 50 60

C ++ не должен быть сложным

Как и любой другой навык, практика необходима, чтобы максимально использовать STL. Эти контейнеры и алгоритмы могут помочь вам сэкономить много времени и просты в использовании. Начните с отработки примеров, показанных выше, и в конечном итоге вы начнете использовать это в своих собственных проектах.

Однако, если вы впервые изучаете C ++, начните с изучения основ, прежде чем переходить к пониманию STL.