Stl vector перше знайомство з вектором, c для початківців

  • Вектори є частиною STL і відносяться до послідовних контейнерів.
  • Послідовні контейнери - це впорядковані колекції, в яких кожен елемент займає певну позицію.
    Відповідно до стандарту C ++, будь-який контейнер повинен містити методи begin (), end (), size (), max_size (), empty (), і swap ().

Вектор (vector) майже те ж саме, що масив, до її елементів можна звертатися також як до елементів масиву. Але у вектора є деякі переваги. Не потрібно спеціально стежити за розміром, так як вектор свій розмір знає. Щоб поміняти розмір досить видалити або додати елементи під час виконання

Щоб використовувати вектор в програмі, потрібно підключити директиву vector і вказати використовуваний простір імен std

Всі Це легше зрозуміти тим, хто знайомий з масивами

Дивимося на схожість обробки вектора і масивів

#include // Підключаємо директиву vector

using namespace std; // Використовуємо простір імен std

vector v (10); // Оголосили вектор в десять елементів типу int

for (int i = 0; i <10 ; i ++ ) v [ i ] = i + 1 ; //Записали в вектор числа 1,2,3. 10

for (int i = 0; i <10 ; i ++ ) cout <

int arr [10]; // Оголосили масив в десять елементів типу int

for (int i = 0; i <10 ; i ++ ) arr [ i ] = i + 1 ; //Записали в массив числа 1,2,3. 10

for (int i = 0; i <10 ; i ++ ) cout <

Думаю хто вже вивчав основи, той відразу зрозуміє що тут до чого.

===================
Основні методи Вектора
push_back (element) - додати елемент в кінець vector-а
pop_back (element) - видалити останній елемент vector-а
insert (***) - три варіанти (перезавантаження методу) вставки в якусь область в векторі, перший параметр позиція вставки задана Ітератор, інші вказують на контейнер, або кількість і контейнер, або пару ітераторів вказують від якої до якої позиції з іншого контейнера взяти дані.
erase (iterator або iterator від, і до) - видаляє елемент або послідовність елементів з vector-а
begin () - повертає ітератор, який вказує на початок колекції.
end () - повертає ітератор, який вказує на кінець колекції. При цьому він вказує не самий останній елемент, а на уявний елемент за останнім.
at (index) - метод доступу, до елементів колекції, на відміну від оператора [], перевіряє вихід з-поза меж колекції, і у випадку чого генерує виняток.
clear () - видаляє всі елементи колекції, при цьому якщо в ньому міститися об'єкти класів викликає їх деструктори. А якщо ж покажчики на об'єкти, то у Вас буде витік пам'яті (memory leaks =)), так delete за Вас ніхто не викличе.
===================

Почав я своє знайомство з векторами з першого і другого методів push_back і pop_back.
Наводжу код програми з моєї невеликої помилкою

Щоб така ініціалізація векторів працювала, можливо в компіляторі потрібно поставити якийсь прапор в налаштуваннях. Де цей прапор я не знаю, так що не варто питати. Мені доведеться обходиться додатковим масивом.

Я не думаю, що мені варто розписувати кожен метод. Мені (може і помилково) здається, що той хто представляє то таке масив, той подивившись на те, що тут вже описано легко зрозуміє що до чого

Крім цього, має сенс розповісти про деякі інші особливості векторів. Одна з таких особливостей, це те, що вектор вміє розширювати обсяг пам'яті при додаванні елементів, але ніколи самостійно не знищує її. Замість того, щоб знищити виділену пам'ять, він залишає цю пам'ять в резерві. Якби вектор мислив, то його думки звучали б так: «А раптом потім стане в нагоді, буду я йому (свого батька) знову виділяти, то що вже виділяв, обійдеться». Тобто якщо насильно не змусити його очистити пам'ять, то скільки максимальної пам'яті було виділено, стільки і залишається виділено. Пов'язано це з тим, що виділення пам'яті операція вимагає деяких витрат часу, отже сильно знижують ефективність програми. Слід розуміти і розрізняти два поняття: Ємність і Розмір вектора. Під ємністю вектора розуміється то, скільки елементів в вектор можна покласти без додаткового виділення пам'яті, а під розміром розуміється то, скільки елементів зберігає в собі вектор. Для того, щоб дізнатися розмір вектора використовується метод вектора size. а для того, щоб дізнатися ємність вектора використовується метод capacity. Варто звернути увагу на те, що метод capacity відображає загальну кількість елементів, а не те, скільки елементів можна додати додатково без додаткових виділень пам'яті

Для тих хто працював з рядками, швидше за все буде зрозуміліше що позначає те, що я тільки що написав. Зазвичай під рядок виділяється певна кількість пам'яті і при виведенні рядка, рядок виводиться до ознаки закінчення, але за ознакою закінчення рядка в лежить сміття. Ось вся рядок, включаючи сміттєвий ділянку - це як ємність вектора.

Резервувати пам'ять в векторі можна самостійно, для цього використовується метод reserve.
Невеликий підсумок до вищесказаного

При роботі з векторами потрібно вміти працювати і з пам'яттю і з кількістю елементів вектора.

Для того, щоб звільнити зарезервовану пам'ять в векторі використовують трюк з обміном Swap Trick

Схожі статті