C++. Клас vector. Динамічний масив. Загальні відомості

Клас vector. Динамічний масив. Загальні відомості. Огляд методів. Створення динамічного масиву. Способи доступу до елементів вектору

Дана тема є початком вивчення засобів класу vector, що представляє собою динамічний масив.


Зміст


Пошук на інших ресурсах:

1. Загальні відомості про клас vector. Огляд методів класу

Клас vector представляє собою динамічний масив, розмір якого у програмі може змінюватись при необхідності. Цей клас є одним з найбільш універсальних та поширених у використанні при написанні програм на C++. Доступ до елементів класу здійснюється як до звичайного масиву з допомогою квадратних дужок [ ].

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

#include <vector>
using namespace std;

Шаблонна специфікація класу vector має наступний вигляд:

template <class T, class Allocator = allocator<T> > class vector

тут

  • T – тип елементів масиву. Це може бути будь-який базовий тип (int, float, char тощо) або тип, розроблений користувачем;
  • Allocator – назва класу, який забезпечує розподіл пам’яті.

Методи класу vector можна умовно розбити на 3 групи:

  • 1. Методи, що визначають та змінюють загальні характеристики масиву.
    • 1.1. Метод size(). Визначити розмір вектору
    • 1.2. Метод max_size(). Максимально-допустимий розмір масиву
    • 1.3. Метод capacity(). Визначити розмір масиву з врахуванням зарезервованої пам’яті
    • 1.4. Метод empty(). Визначити, чи пустий вектор
    • 1.5. Метод shrink_to_fit(). Вирівняти розмір масиву з врахуванням зарезервованої пам’яті за фактичним розміром масиву
    • 1.6. Метод reserve(). Зарезервувати пам’ять для додаткових елементів масиву
    • 1.7. Метод resize(). Змінити розмір масиву
  • 2. Методи, що модифікують (змінюють) дані в масиві
    • 2.1. Метод push_back(). Додати елемент в кінець вектору
    • 2.2. Метод pop_back(). Видалити останній елемент вектору
    • 2.3. Метод clear(). Видаляє з масиву всі елементи
    • 2.4. Метод swap(). Обмін місцями двох векторів
    • 2.5. Присвоєння масивів. Перевантажений оператор =
    • 2.6. Метод erase(). Видалити елемент або ряд елементів заданого діапазону
    • 2.7. Метод insert(). Вставляє елемент або групу елементів у вектор
      • 2.7.1. Вставка списку ініціалізації у вектор
      • 2.7.2. Вставка елементу задану кількість разів у задану позицію
      • 2.7.3. Вставка одиночного елементу у задану позицію
      • 2.7.4. Вставка декількох елементів з заданого діапазону
    • 2.8. Метод assign(). Утворити масив з існуючих даних
  • 3. Методи, що забезпечують доступ до елементів масиву
    • 3.1 Метод at(). Отримати елемент вектору за його позицією (індексом)
    • 3.2. Метод front(). Повертає посилання на перший елемент вектору
    • 3.3. Метод back(). Повертає посилання на останній елемент вектору
    • 3.4. Метод data(). Отримати покажчик на вектор
    • 3.5. Метод begin(). Повернути ітератор, що вказує на перший елемент вектору
    • 3.6. Метод end(). Повернути ітератор, що вказує на останній елемент масиву
    • 3.7. Методи cbegin(), cend(). Отримати константний ітератор на початок та кінець масиву
    • 3.8. Методи rbegin(), rend(). Доступ до елементів масиву з допомогою реверсного ітератора
    • 3.9. Методи crbegin(), crend(). Встановити на початок та кінець масиву константний реверсний ітератор

 

2. Створення динамічного масиву типу vector. Конструктори. Приклад

Для створення масиву у класі vector оголошується ряд конструкторів. Нижче наведено найбільш поширені з них.

Щоб створити пустий масив використовується конструктор

explicit vector(const Allocator &a = Allocator());

Щоб створити масив, який містить num елементів зі значенням val, використовується конструктор

explicit vector(size_t num, const T &val = T(),
const Allocator &a = Allocator());

Щоб створити масив на основі іншого масиву ob, потрібно використати конструктор

vector(const vector<T, Allocator> &ob);

Щоб створити масив на основі діапазону на який вказують ітератори start та end, використовується наступний конструктор

template <class InIter> vector<InIter start, InIter end,
const Allocator &a = Allocator());

Приклад. У прикладі створюються різні масиви типу vector.

#include <vector>
using namespace std;

...

// 1. Створити вектор з 10 чисел типу int
vector<int> A1(10);

// 2. Створити пустий вектор, елементи якого мають тип char
vector<char> A2;

// 3. Створити вектор з 5 чисел типу double,
// записати у вектор значення 1.0
vector<double> A3(5, 1.0);

// 4. На основі вектору A3 створити новий вектор A4
vector<double> A4(A3);

// 5. Створити вектор на основі ітераторів, які вказують на
//     елементи вектору A4 з індексами від 0 до 1.
vector<double>::iterator start, end; // оголосити ітератори
start = A4.begin();   // встановити перший ітератор на позицію 0
end = A4.begin() + 2; // другий ітератор в позиції 2 (позиція після 1)
vector<double> A5(start, end); // створити вектор

...

 

3. Способи доступу до елементів вектору. Індексування [ ]

Після створення вектору, можна отримувати доступ до його елементів одним з наступних способів:

  • з допомогою операції індексування [ ], як у випадку зі звичайним масивом;
  • з допомогою ітератора;
  • з допомогою методу at().

Приклади доступу до елементів вектора.

#include <vector>
using namespace std;

...

// 1. Доступ до вектора з допомогою індексатора []
// 1.1. Створити вектор з 5 чисел типу int
vector<int> A1(5);

// 1.2. Записати у вектор значення [ 1, 2, 3, 4, 5 ]
for (int i = 0; i < A1.size(); i++)
  A1[i] = i + 1;

// 1.3. Вивести вектор на екран
for (int i = 0; i < A1.size(); i++)
  cout << A1[i] << " ";
cout << endl;

// 2. Доступ до елементів вектору з допомогою ітераторів
// 2.1. Створити вектор з 5 чисел типу float
vector<float> A2(5);

// 2.2. Оголосити ітератор на вектор типу float
vector<float>::iterator p;

// 2.3. Записати у вектор числа [ 1.1, 2.2, 3.3, 4.4, 5.5 ]
//      з допомогою ітератора
p = A2.begin();
int i = 0;
while (p != A2.end())
{
  *p = (float)((i + 1) + (i + 1) * 0.1);
  p++;
  i++;
}

// 2.4. Вивести вектор з допомогою ітератора
p = A2.begin();
while (p != A2.end())
{
  cout << *p << " ";
  p++;
}
cout << endl;

// 3. Доступ до елементів вектору з допомогою методу at()
//    Метод at() - отримати елемент вектору за його позицією
vector<double> A3(5); // Створити масив з 5 елементів типу double

// Заповнити довільними значеннями
A3.at(0) = 2.8; // A3[0] = 2.8;
A3.at(1) = 3.3; // A3[1] = 3.3;

...

 


Споріднені теми