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

Что такое STL?

STL (стандартная библиотека шаблонов): STL предоставляет набор общих классов для C ++, таких как контейнеры (очередь, стек) и ассоциативные массивы (хеш-таблицы), которые можно использовать с любыми встроенными данными. -type и с любым определяемым пользователем типом данных, который поддерживает некоторые элементарные операции (такие как копирование и присваивание).

Все STL обеспечивают динамическое распределение памяти. Вектор и строка имеют непрерывное выделение памяти, а остальные имеют несмежное выделение памяти.

Итак, теперь мы должны увидеть каждый STL один за другим: -

Вектор: -

Это похоже на массив, но с динамическим непрерывным распределением памяти. Это входит в вектор библиотеки STL.

Добавляемая библиотека: - вектор (#include ‹vector›)

Объявление вектора: -

вектор ‹тип данных› имя-вектора;

здесь тип данных может быть любым встроенным типом данных (char, int, float, double) или любым типом данных, определяемым пользователем (классы, структуры).

Разница и сходство между вектором и массивом: -

Объявление массива, в котором может храниться 8 целых чисел, будет выглядеть как
int arr [8];

и если мы хотим использовать вектор вместо массива, нам просто нужно написать
vector ‹int› v; (размер указывать необязательно)

Указание размера при объявлении вектора: -

vector ‹int› v (8);
(также можно не указывать размер)

vector ‹int› v;
(Это объявление не означает, что этот вектор v будет хранить только одно целое число. Это список целых чисел с непрерывным распределением памяти).

Мы используем функцию push_back для вставки любого элемента в конец вектора.

предположим, мы написали следующий код

vector<int> v;
for(int i=0;i<8;i++){
    arr[i]=i;
    v.push_back(i);
}

Теперь в этом векторе v 8 целых чисел 0,1,2,3,4,5,6,7.

Разница:

Разница между вектором и массивом заключается в том, что размер в векторе не является фиксированным и может быть изменен динамически, потому что вектор имеет динамическое распределение памяти, а массив имеет статическое выделение памяти. Нам не нужно указывать размер при декларировании.

Сходство:

Сходство между вектором и массивом состоит в том, что они оба имеют непрерывное распределение памяти. Преимущество непрерывного распределения памяти состоит в том, что мы можем получить доступ к любому элементу с временной сложностью O (1), указав индекс элемента в квадратных скобках с именем вектора.

Предположим, мы хотим получить доступ к 5-му элементу в массиве, тогда мы напишем arr [4], и это будет то же самое в векторе v [4] (из-за непрерывного выделения памяти). как вектор, так и массив будут выводить 4 из-за приведенного выше кода. Но мы не можем получить доступ таким же образом в list, потому что он имеет несмежное выделение памяти. По сути, это связанный список, и временные сложности для всех операций такие же, как и у структуры данных связанного списка.

Мы можем выполнять все операции с векторами так же, как и с массивами.

Вот некоторые функции-члены, которые часто используются в векторе: -

  1. push_back (arg): - эта функция помещает элемент arg в конец вектора.
  2. pop_back (): - эта функция выталкивает элемент с конца вектора.
  3. back (): - эта функция возвращает последний элемент вектора.
  4. front (): - эта функция возвращает первый элемент вектора.
  5. clear (): - эта функция очищает вектор.
  6. size (): возвращает общее количество элементов, хранящихся в векторе.
  7. begin (): возвращает итератор, указывающий на первый элемент вектора.
  8. end (): возвращает итератор, указывающий на теоретический элемент, следующий за последним элементом.

Все вышеперечисленные функции имеют временную сложность O (1).

Пример: -

#include<iostream>
#include<vector>
using namespace std;
int main() {
    vector<int > v;
    int i;
 
    for(i=0;i<8;i++) {
        v.push_back(i);
    }
    cout<<”First element is:- “<<v.front()<<endl;
    cout<<”Last element is:- “<<v.back()<<endl;
    cout<<”Elements in the vector are:- “<<endl;
 
    for(i=0;i<v.size();i++) {
        cout<<v[i]<<endl;
    }
    v.pop_back();
    cout<<”Last element after pop_back:- “<<v.back()<<endl;
    v.clear();
    cout<<”Size of vector after clearing the vector:- “<<v.size();
    return 0;
}
Output of the above program:-
First element is:- 0
Last element is:- 7
Elements in the vector are:- 
0
1
2
3
4
5
6
7
Last element after pop_back:- 6
Size of vector after clearing the vector:- 0

Как вектор выполняет динамическое и непрерывное размещение?: -

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

Строка: -

Последовательность символов называется String. Он также имеет непрерывное и динамическое распределение памяти и работает так же, как вектор для динамического и непрерывного распределения памяти.

Добавляемая библиотека: - строка (#include ‹string›)

Объявление строки: -

строка имя-строки;

Как объявить массив символов в C: -

char str[N+1]; ( Here N is the number of characters in the string and extra 1 for null character )

но если вы хотите использовать строку STL, мы объявим ее как.

string str; ( Here we do not need to specify the size )

Теперь мы можем использовать то же самое, что и символьный массив, но мы не можем использовать какую-либо функцию из string.h в c, потому что str является объектом строки класса, а str в объявлении символьного массива является указателем.

Для сравнения строковых объектов присваивание и конкатенация очень просты, и нам не нужно писать какую-либо функцию, для которой мы можем сравнивать их так же, как мы сравниваем целые числа.

string s1=”abc”,s2=”cde”;
s1<s2 , s1==s2 , s2≥s1 any comparison will work fine but with same string object.
s1+=s2; ( This concatenation will make s1=”abccde” ).

Вот некоторые из функций-членов строки: -

  1. length (): возвращает размер строки.
  2. clear (): - очищает строку
  3. substr (pos, len): - возвращает подстроку, начиная с pos (с индексом 0) и размером len. Если запрошенная подстрока выходит за пределы конца строки, возвращается подстрока [pos, size()).

Пример кода: -

#include<iostream>
#include<string>
using namespace std;
int main() {
    string s=”abcdefghijklmnopqrstuvwxyz”;
 
    cout<<”Length of the String:- “<<s.length()<<endl;
    cout<<”Characters in the String:- “;
 
    for(int i=0;i<s.length();i++) {
       cout<<s[i]<<’ ‘;
    }
 
    cout<<endl;
 
    cout<<”Substring is:- “<<s.substr(23,3)<<endl;
 
    s.clear();
    cout<<s.length();
    return 0;
}
Output of the above program:-
Length of the String:- 26
Characters in the String:- a b c d e f g h i j k l m n o p q r s t u v w x y z 
Substring is:- xyz

Очередь

Очередь - это линейная структура данных, соответствующая принципу FIFO (первый пришел - первый ушел). Элементы будут вставлены в конец и удалены спереди.

Push and pop in queue: - Push означает вставку элемента, а Pop означает удаление элемента.

Он имеет динамическое, но несмежное выделение памяти.

Добавляемая библиотека: - очередь (#include ‹queue›)

Объявление очереди: -
queue ‹data-type› имя-очереди;

( Здесь тип данных может быть любым встроенным или определенным пользователем типом данных)

Вот некоторые функции-члены очереди stl: -

  1. size (): - возвращает количество элементов в очереди.
  2. front (): возвращает первый элемент в очереди.
  3. push (arg): - помещает arg в очередь.
  4. pop (): - выталкивает первый элемент из очереди и ничего не возвращает.
  5. empty (): - возвращает true, если очередь пуста, иначе false.
  6. back (): - возвращает последний элемент очереди.

Пример кода: -

#include<iostream>
#include<queue>
using namespace std;
int main() {
    queue<int> q;
    for(int i=0;i<4;i++) {
        q.push(i);
    }
    cout<<"Size of the queue is:- "<<q.size()<<endl;
    while(!q.empty()) {
        cout<<"First element in the queue:- "<<q.front()<<endl;
        cout<<"Last element in the queue:- "<<q.back()<<endl;
        q.pop();
        cout<<"Element popped"<<endl;
    }
    return 0;
}
Output of the above program:-
Size of the queue is:- 4
First element in the queue:- 0
Last element in the queue:- 3
Element popped
First element in the queue:- 1
Last element in the queue:- 3
Element popped
First element in the queue:- 2
Last element in the queue:- 3
Element popped
First element in the queue:- 3
Last element in the queue:- 3
Element popped

Стек: -

Стек - это структура данных, соответствующая LIFO (Last in First Out). Элементы будут вставлены в конец и удалены с конца.

Он имеет динамическое, но несмежное выделение памяти.

Добавляемая библиотека: - стек (#include ‹stack›)

Объявление стека: -
stack ‹data-type› имя-стека;

( Здесь тип данных может быть любым встроенным или определенным пользователем типом данных)

Вот некоторые функции-члены очереди stl: -

  1. size (): - возвращает количество элементов в стеке.
  2. push (arg): - помещает arg в стек.
  3. pop (): - извлекает первый элемент из стека и ничего не возвращает.
  4. empty (): - возвращает true, если стек пуст, иначе false.
  5. top (): возвращает элемент, который находится на вершине стека .

Пример кода: -

#include<iostream>
#include<stack> 
using namespace std;
int main() {
    stack<int > st;
    for(int i=0;i<4;i++) {
        st.push(i);
    }
    cout<<"Size of the stack is:- "<<st.size()<<endl;
    while(st.empty()==false) {
        cout<<"Element at the top of the stack:- "<<st.top()<<end;
        st.pop();
        cout<<"Element popped"<<endl;
    }
    return 0;
}

Output of the above program:-
Size of the stack is:- 4
Element at the top of the stack:- 3
Element popped
Element at the top of the stack:- 2
Element popped
Element at the top of the stack:- 1
Element popped
Element at the top of the stack:- 0
Element popped