STL. Специализированные контейнеры
В языке C++ и библиотеке STL есть некоторые специализированные контейнеры, которые подходят для довольно узких задач, часть из них мы уже использовали, часть необходимо описать отдельно:
Для работы контейнеров как правило требуется использование пространства имен std
using namespace std;
Контейнер array:
Array реализует массив на стеке (статический массив).
По сути реализует массив на стеке, м.б. удобен за счет реализованных методов.
В отличие от вектора он требует меньше ресурсов (т.к. не нужна работа с динамической памятью)
Для работы необходимо подключить библиотеку
#include <array>
Array входит в пространство имен std, поэтому или пишем std:: или используем пространство имен using namespace std;
array<type,size> MyArr;
например: array<int,3> arr={1,2,3};
Методы аналогичны другим контейнерам, и по сути массив аналогичен обычному, но есть некоторые удобные методы.
Например:
MyArr[ ]; //обращение без контроля диапазона
MyArr.at(); //обращение с контролем границ массива, метод медленнее
MyArr.fill(); //заполняет массив значениями
MyArr.size(); //получение размера массива
Контейнер bitset:
Часто при работе с устройствами индикация состояний происходит через выставление битов, для наиболее удобной работы можно воспользоваться контейнером bitset, у которого есть множество методов и перегружен оператор [].
#include //добавляет контейнер битовых масок
bitset<10> MyBitSet{978}; //создаем контейнер на 10 бит
cout<<MyBitSet.to_string()<<endl; //выводим биты 11 1101 0010
cout<<MyBitSet.to_ulong()<<endl; //выводим 978 (приводим к unsigned long)
cout<<MyBitSet.to_ullong()<<endl; //выводим 978 (приводим к unsigned long long)
MyBitSet.set(1); //Функция позволяет инициализировать все биты единицами или изменить значение отдельного бита.
MyBitSet.reset(1); //Обнуление указанных битов (сброс битов в 0).
MyBitSet.flip(); //Преобразовать битовую маску в обратный код. То есть 1-цы заменить нулями, а 0 — единицами.
MyBitSet.to_ulong(); //Преобразовать битовый объект в целое длинное беззнаковое значение.
MyBitSet.to_string(); //Преобразовать битовую последовательность в строку типа string, которая будет содержать символы 0 и/или 1.
MyBitSet.count(); //Возвращает количество единичных битов объекта bitset.
MyBitSet.size(); //Возвращает размер в битах
MyBitSet.test(1); //Возвращает значение указанного бита объекта bitset.
MyBitSet.any(); //Проверяет битовое значение на предмет наличия в объекте bitset единичных битов.
MyBitSet.none(); //Проверяет битовое значение на предмет наличия в объекте bitset нулевых битов
Контейнер бинарный вектор:
Одной из интересных разновидностей битовых контейнеров является вектор битовых значений.
#include <vector>
vector<bool> V_Bool;
V_Bool.push_back(true); //true - любое неотрицательное число
V_Bool.push_back(0);
for(unsigned int i=0; i<V_Bool.size();++i) cout<<V_Bool[i]<<endl;
По сути это обычный вектор, в котором элементы типа bool, из плюсов более компактное хранение, чем в обычном векторе.
Контейнеры на 2 и более элементов:
Иногда требуются специфические контейнеры, содержащие 2,3,4 и тд элементов, для этих целей используются:
Контейнер pair:
немного мы его коснулись при обсуждении контейнера map/multimap.
#include
pair<int, string> Pair_1={1, "Name"};
cout<<Pair_1.first<<endl;
cout<<Pair_1.second<<endl;
Контейнер tuple:
#include <tuple>
tuple<string, int, bool> UserPush("Btn Pressed", 1, true);
cout<<get<0>(UserPush)<<endl; //обращаемся к 0 элементу
get<2>(UserPush)=false; //изменяем 2 элемент
cout<<get<2>(UserPush)<<endl; //обращаемся к 2 элементу
Примечание:
Контейнер для работы с символами:
basic_string<’символ’> — последовательность из симоволов, поддерживаются символьные операции
Контейнер для работы с числами:
valarray<T> — создает массив числовых значений типа T, поддерживаются математические операции.