04. STL. Vector

STL. Vector

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

Для работы с вектором необходимо подключить библиотеку
#include <vector>
Вектор входит в пространство имен std, поэтому или пишем std:: или используем пространство имен using namespace std;

Опишем основные методы для работы с вектором:

    vector myVector;           //просто массив
    vector myVector(20,1);     //массив из 20 элементов равных 1
    vector myVector={0,1,2,3,4,5}; //массив из 4 элементов 0,1,2,3


    myVector.pop_back();        //удалить последний элемент
    myVector.push_back();       //добавить элемент в конец

    myVector.resize(10);          //изменить размер в векторе, чтобы было 10 элементов, можно их сразу заполнить myVector.resize(10, 1);
    myVector.capacity();        //Емкость массива (максимальное кол-во элементов на текущий момент)
    myVector.reserve(100);      //увеличивает capacity в данном случае до 100 т.е. возможное число элементов 0-100
    myVector.shrink_to_fit();   //уменьшить capacity/массив до размера size

    myVector.size();            //узнать кол-во элементов
    myVector.clear();           //удалить все элементы вектора
    bool myVector.empty();      //если вектор пустой - возвращает true

    //обращение к вектору без проверки
    myVector[10]
    //обращение к вектору с проверкой на выход за границы массива - ЭТОТ СПОСОБ обычно медленнее
    myVector.at(10);


    myVector.begin();   //Возвращает итератор начала массива
    myVector.end();     //Возвращает итератор конца массива +1 (следующий элемент за границами массива)

    myVector.erase();   //удалить элемент по указщателю/итератору
    myVector.insert();  //добавить элемент по указщателю/итератору

    //примеры работы с insert
    vector::iterator iter=myVector.begin(); //создаем итератор и указываем на начало
    advance(iter, 3);//изменяем итератор на 3, можно было бы написать iter+=3;
    myVector.insert(iter,11); //ставим в 3 позицию число 11

    //примеры работы с erase
    vector::iterator iterErase=myVector.begin(); //создаем итератор и указываем на начало
    advance(iterErase, 2);//изменяем итератор на 2, можно было бы написать iter+=2;
    myVector.erase(iterErase); //удаляем в 2 позицию


    for(vector::iterator i=myVector.begin();i!=myVector.end(); i++)
    {
      cout<<*i<<endl;
    }

Можно удалить диапазон элементов:

vector<int>::iterator iterErase=myVector.begin(); //создаем итератор и указываем на начало
myVector.erase(iterErase, iterErase+3); //удаляем 0-2 элементы. (0-3 не включительно)

Отдельно стоит сказать про capacity – емкость
Самая затратная операция у массива — его расширение, в этом случае создается новый массив и в него копируются все данные, чтобы немного упростить работу в классе вектора выделяется чуть больше памяти, чтобы можно было добавить несколько элементов.

Примечание:
При работе с 1 итератором и многократным изменением адресов возникали проблемы, судя по всему после каждого добавления/ удаления элемента необходимо «обнулять итератор» указав на первый элемент.
Видимо проблема из-за изменения нумерации от добавления/удаления элементов

//примеры работы с insert
    vector::iterator iter=myVector.begin(); //создаем итератор и указываем на начало
    advance(iter, 2);//изменяем итератор на 2
    myVector.insert(iter,11); //ставим в 3 позицию число 11


    iter=myVector.begin(); //если не делать присвоение, то ошибка
    advance(iter, 1);
    myVector.insert(iter,10); //ставим в 4/1 позицию число 11, но возникает ошибка (advance проходит)

По сути проблема с использованием в insert/erase одного и того же ИМЕНИ итератора.

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

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