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 одного и того же ИМЕНИ итератора.