Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
+ООП_Навч_посібник.doc
Скачиваний:
7
Добавлен:
01.07.2025
Размер:
6.58 Mб
Скачать

22.3.1. Доступ до вектора за допомогою ітератора

Як уже зазначалося вище, масиви і покажчики у мові програмування C++ тісно пов'язані між собою. До елементів масиву можна отримати доступ як за допомогою індексу, так і за допомогою покажчика. У бібліотеці STL аналогічний зв'язок існує між векторами й ітераторами. Це означає, що до членів вектора можна звертатися як за допомогою індексу, так і за допомогою ітератора. Цю можливість продемонстровано у наведеному нижче коді програми.

Код програми 22.2. Демонстрація механізму доступу до вектора за допомогою ітератора

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

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

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

int main()

{

vector<char> vek; // Побудова вектора нульової довжини

int i;

// Поміщаємо значення у вектор.

for(i=0; i<10; i++) vek.push_back('A' + i);

// Отримуємо доступ до вмісту вектора за допомогою індексу.

for(i=0; i<10; i++) cout << vek[i] << " ";

cout << endl;

// Отримуємо доступ до вмісту вектора за допомогою ітератора.

vector<char>::iterator p = vek.begin();

while(p != vek.end()) {

cout << *p << " ";

p++;

}

getch(); return 0;

}

Ось як виглядають результати виконання цієї програми:

ABCDEFGHIJ

ABCDEFGHIJ

У цій програмі спочатку створюється вектор нульової довжини. Потім за допомогою функції push_back() у кінець вектора поміщаються символи, внаслідок чого розмір вектора відповідним чином збільшується.

Звернемо Вашу увагу на те, як оголошується ітератор р. Тип цього ітератора визначається контейнерними класами. Тому для отримання ітератора для конкретного контейнера використовуйте оголошення, аналогічне показаному у цьому прикладі: просто вкажіть для цього ітератора ім'я контейнера. У нашій програмі ітератор р ініціалізувався так, щоб він указував на початок вектора (за допомогою функції-члена класу begin()). Ітератор, який повертає ця функція, можна потім використовувати для поелементного доступу до вектора, інкрементуючи його відповідним чином. Цей процес аналогічний тому, як можна використовувати покажчик для доступу до елементів масиву. Щоб визначити, коли буде досягнуто кінець вектора, використовується функція-член end(). Ця функція повертає ітератор, встановлено за останнім елементом вектора. Тому, якщо значення р дорівнює vek.end(), то кінець вектора досягнуто.

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

Окрім занесення нових елементів у кінець вектора, у нас є можливість вставляти елементи у середину вектора, використовуючи функцію insert(). Видаляти елементи можна за допомогою функції erase(). Використання функцій insert() і erase() продемонстровано у наведеному нижче коді програми.

Код програми 22.3. Демонстрація механізму вставлення елементів у вектор і видалення їх з нього

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

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

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

int main()

{

vector<char> vek; // Побудова вектора нульової довжини

unsigned int i;

// Поміщаємо значення у вектор.

for(i=0; i<10; i++) vek.push_back('A' + i);

// Відображаємо початковий вміст вектора.

cout << "Розмір = " << vek.size() << endl;

cout << "Початковий вміст вектора:\n";

for(i=0; i<vek.size(); i++) cout << vek[i] << " ";

cout << endl;

// Отримуємо доступ до вмісту вектора за допомогою ітератора.

vector<char>::iterator p = vek.begin();

p += 2; // Покажчик на 3-й елемент вектора

// Вставляємо 10 символів 'x' у вектор vek.

vek.insert(p, 10, 'x');

// Відображаємо вміст вектора після вставки символів.

cout << "Розмір вектора після вставки = " << vek.size() << endl;

cout << "Вміст вектора після вставки:\n";

for(i=0; i<vek.size(); i++) cout << vek[i] << " ";

cout << endl;

// Видалення вміщених елементів.

p = vek.begin();

p += 2; // Покажчик на 3-й елемент вектора

vek.erase(p, p+10); // Видаляємо 10 елементів підряд.

// Відображаємо вміст вектора після видалення символів.

cout << "Розмір вектора після видалення символів = "

<< vek.size() << endl;

cout << "Вміст вектора після видалення символів:\n";

for(i=0; i<vek.sized; i++) cout << vek[i] << " ";

cout << endl;

getch(); return 0;

}

У процесі виконання ця програма відображає такі результати:

Розмір = 10

Початковий вміст вектора:

A B C D E F G H I J

Розмір вектора після вставки = 20

Вміст вектора після вставки:

A B x x x x x x x x x x C D E F G H I J

Розмір вектора після видалення символів = 10

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

A B C D E F G H I J