13. STL. Специализированные контейнеры

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, поддерживаются математические операции.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *