Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Не підтверджено.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
3.08 Mб
Скачать
  1. Механізми роботи з векторами

Одним з найпоширеніших контейнерів загального призначення є вектор. Ана­логічний клас vector підтримує динамічний масив, який у разі потреби може збіль­шувати (зменшувати) свій розмір. Як уже зазначалося вище, у мові програмуван­ня C++ розмір масиву фіксується при компілюванні. І хоча це найефективніший спосіб реалізації масивів, він водночас є і обмежувачем, оскільки розмір масиву не можна змінювати у процесі виконання програми. Ця проблема розв'язується за допомогою вектора, який у міру потреби забезпечує виділення додаткового об'єму пам'яті. Незважаючи на те, що вектор - це динамічний масив, проте, для доступу до його елементів можна використовувати стандартне позначення індексації еле­ментів масивів.

Вектори є динамічними масивами.

Ось як виглядає шаблонна специфікація для класу vector:

template <class myType, class Allocator = allocator<myType» class vector

У цьому записі myType - тип даних, який зберігається, а елемент Allocator озна­чає розподільник пам'яті, який за замовчуванням використовує стандартний роз­подільник. Клас vector має такі конструктори: explicit vector(const Allocator &а = AllocatorO);

explicit vector(size_type num, const myType &val = myTypeO, const Allocator &a = AllocatorO); vector(const vector<myType, Allocator &ob);

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

Перша форма конструктора призначена для створення порожнього вектора. Друга створює вектор, який містить пит "елементів із значенням val", причому зна­чення val може бути встановлено за замовчуванням. Третя форма дає змогу ство­рити вектор, який містить ті самі елементи, що і заданий вектор ob. Четверта приз­начена для створення вектора, який містить елементи у діапазоні, заданому пара- метрами-ітераторами start і end.

Заради досягнення максимальної гнучкості та переносності будь-який об'єкт, який призначено для зберігання у векторі, повинен визначатися конструктором за замовчуванням. Окрім цього, він повинен визначати операції "<" і "==". Деякі компілятори можуть зажадати визначення і інших операторів порівняння. (З при­чини існування різних реалізацій для отримання точної інформації про вимоги, що пред'являються Вашим компілятором, необхідно звернутися до документації, що додається до нього.) Всі вбудовані типи даних автоматично задовольняють ці вимоги.

Незважаючи на те, що наведений вище синтаксис шаблону виглядає дос­татньо "масивним", у оголошенні вектора немає нічого складного. Розглянемо де­кілька прикладів:

vector<int> iv; // Створення вектора нульової довжини для зберігання int-значень.

vector<char> cv(5); // Створення 5-елементного вектора для зберігання char-значень. vector<char> cv(5, Y); // Ініціалізація 5-елементного char-вектора. vector<int> iv2(iv); // Створення int-вектора на основі int-вектора iv.

Для класу vector визначено такі оператори порівняння: ==, <, <=, !=, > і >=. Для вектора також визначено оператор індексації елементів масиву "[]", який дає змогу отримати доступ до своїх елементів за допомогою стандартного запису

з використанням індексів. Функції-члени, визначені у класі vector, перераховані в табл. 12.2. Найважливішими з них є sizeO, begin(), endO, push_back(), insertO і erase(). Дуже корисна функція sizeO, яка повертає поточний розмір вектора, оскільки вона дає змогу визначити розмір вектора у процесі виконання програми.

Нео! хідноапам ятати! Вектори у разі потреби збільшують свій розмір, тому потрібно мати можливість визначати його величину під час роботи ко­ду програми, а не тільки при компілюванні.

Функція begin() повертає ітератор, який вказує на початок вектора. Функція endO повертає ітератор, який вказує на кінець вектора. Як уже пояснювалося ви­ще, ітератори подібні до покажчиків, і за допомогою функцій begin() і end() можна отримати ітератори початку і кінця вектора відповідно.

Табл. 12.2. Функції-члени, визначені у класі vector

OyHKiiia-HJieH

Опис

1

2

template <class lnlter> void assign(lnlter start, Inlter end)]

Поміщає у вектор послідовність, що визна­чається параметрами start і end

void assign(size_type num, const myType &val)]

Поміщає у вектор пит елементів із значенням val

reference at(size_type /);

const reference atfsize type i) const;

Повертає посилання на елементи, які задаються параметром і

reference back();

const reference back() const;

Повертає посилання на останній елемент у век­торі

iterator beginO;

const iterator beginf) const;

Повертає ітератор для першого елемента у век­торі

size_type capacityO const;

Повертає поточну місткість вектора, або кіль­кість елементів, яка може зберігатися у векторі до того, як виникне потреба у виділенні додатко­вої пам'яті

void clearO;

Видаляє всі елементи з вектора

bool emptyO const;

Повертає істинне значення, якщо використову­ваний вектор є порожнім, і помилкове значення - інакше

const iterator end() const; iterator endO;

Повертає ітератор для кінця вектора

iterator erase(iterator /);

Видаляє елемент, який адресується ітератором і\ повертає ітератор для елемента, розташованого після видаленого

iterator erase(iterator start, iterator end)]

Видаляє елементи у діапазоні, що задається па­раметрами start і end', повертає ітератор для еле­мента, розташованого за останнім видаленим елементом

reference front();

const reference frontf) const;

Повертає посилання на перший елемент у векто­рі

allocator type get allocator() const;

Повертає розподільник пам'яті вектора

iterator insert(iterator /',

const myType &val= myType ());

Вставляє значення val безпосередньо перед еле­ментом, заданим параметром /’; повертає ітератор для цього елемента

void insert(iterator /, sizejype num, const myType &val)]

Вставляє пит копій значення val безпосередньо перед елементом, заданим параметром і

template <class lnlter> void insert(itera- tor /',

Inlter start, Inlter end)]

Вставляє у вектор послідовність елементів, що визначаються параметрами start і end, безпосе­редньо перед елементом, заданим параметром і

sizejype max_size() const;

Повертає максимальну кількість елементів, яку може містити вектор

reference operator[](size_type /) const; const_reference operator[](size_type /) const;

Повертає посилання на елементи, які задаються параметром і

void pop backQ;

Видаляє останній елемент у векторі

void push_back(const myType &val);

Додає у кінець вектора елемент, значення якого задане параметром val

reverse_iterator rbegin();

const reverse iterator rbeginO const;

Повертає реверсивний ітератор для кінця векто­ра

reversejterator rendQ;

Повертає реверсивний ітератор для початку век-


1

2

const reverse iterator rendO const;

тора

void reserve(size_type num);

Встановлює місткість вектора, що дорівнює зна­ченню, не меншому від заданого пит

void resize(size_type num, myType val

= myTypeO);

Встановлює розмір вектора, що дорівнює зна­ченню, заданому параметром пит. Якщо вектор для цього потрібно подовжити, то в його кінець додаються елементи із значенням, що задається параметром val

size type size() const;

Повертає поточну кількість елементів у векторі

void swap(deque<myType, Allocator

&ob):

Здійснює обмін елементами викличного вектора і вектора ob

Функція push_back() поміщає задане значення у кінець вектора. У разі потреби довжина вектора збільшується так, щоб він міг прийняти новий елемент. За допо­могою функції insert() можна додавати елементи у середину вектора. Окрім цього, елементи вектора можна ініціалізувати. У будь-якому випадку, якщо вектор міс­тить елементи, то для доступу до них і їх модифікації можна використовувати за­сіб індексації елементів масивів. А за допомогою функції erase() можна видаляти елементи з вектора.

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

Код програми 12.1. Демонстрація механізму базової поведінки вектора #include <vcl>

#include <iostream> // Для потокового введення-виведення

#include <conio> // Для консольного режиму роботи

#include <vector> // Для роботи з контейнерним класом "Вектор"

using namespace std; // Використання стандартного простору імен