- •7. Робота з шаблонними, функціями та класами
- •7.1. Поняття про узагальнені функції
- •7.1.1. Механізм реалізації шаблонної функції з одним узагальненим типом
- •7.1.2. Безпосередньо задане перевизначення узагальненої функції
- •7.1.3. Шаблонна функція з двома узагальненими типами
- •7.1.4. Механізм перевизначення специфікації шаблону функції
- •7.1.5. Використання стандартних параметрів у шаблонних функціях
- •7.2. Поняття про узагальнені класи
- •7.1.6. Обмеження, які застосовуються при використанні узагальнених функцій
- •7.1.7. Приклад створення узагальненої функції abs()
- •7.2.1. Створення класу з одним узагальненим типом даних
- •7.2.2. Створення класу з двома узагальненими типами даних
- •7.2.3. Приклад створення узагальненого класу для організації безпечного масиву
- •7.2.4. Використання в узагальнених класах аргументів, що не є узагальненими типами
- •11.2.1. Передача покажчиком на функцію її адреси іншій функції
- •9.2.3. Класи потоків
- •9.3. Особливості механізмів перевизначення операторів введення-виведення даних
- •9.3.1. Створення перевизначених операторів виведення даних
- •9.5. Організація файлового введення-виведення даних
- •9.5.1. Відкриття та закриття файлу
- •9.5.2. Зчитування та запис текстових файлів
- •9.5.3. Неформатне введення-виведення даних у двійковому режимі
- •9.5.4. Зчитування та записування у файл блоків даних
- •10. Динамічна ідентифікація типів і оператори приведення типу
- •10.1. Динамічна ідентифікація типів
- •10.1.1. Отримання типу об'єкта у процесі виконання програми
- •10.1.2. Приклад rtti-застосування
- •11. Поняття про простори імен та інші ефективні програмні засоби
- •11.1. Особливості організації простору імен
- •11.1.1. Поняття про простори імен
- •11.1.2. Застосування настанови using
- •11.1.3. Неіменовані простори імен
- •11.1.4. Застосування простору імен std
- •11.2. Застосування покажчиків на функції
- •11.2.2. Пошук адреси перевизначеної функції
- •11.3. Поняття про статичні члени-даних класу
- •11.5. Застосування до функцій-членів класу модифікаторів const і mutable
- •11.6. Використання explicit-конструкторів
- •12. Введення в стандартну бібліотеку шаблонів
- •12.1. Огляд стандартної бібліотеки шаблонів
- •12.2. Поняття про контейнерні класи
- •12.3. Механізми роботи з векторами
- •12.3.1. Доступ до елементів вектора за допомогою ітератора
- •12.3.2. Вставлення та видалення елементів з вектора
- •12.3.3. Збереження у векторі об'єктів класу
- •12.3.4. Доцільність використання ітераторів
- •7. Робота з шаблонними, функціями та класами 1
- •7.1. Поняття про узагальнені функції 1
- •10. Динамічна ідентифікація типів і оператори приведення типу 26
- •11. Поняття про простори імен та інші ефективні програмні засоби 31
- •12. Введення в стандартну бібліотеку шаблонів 44
12.3.1. Доступ до елементів вектора за допомогою ітератора
Як уже зазначалося вище, масиви і покажчики у мові програмування C++ тісно пов'язані між собою. До елементів масиву можна отримати доступ як за допомогою індексу, так і за допомогою покажчика. У бібліотеці STL аналогічний зв'язок існує між векторами й ітераторами. Це означає, що до членів вектора можна звертатися як за допомогою індексу, так і за допомогою ітератора. Цю можливість продемонстровано у наведеному нижче коді програми.
Демонстрація механізму доступу до елементів вектора за допомогою ітератора
#include <vcl>
#include <iostream> // Для потокового введення-виведення
#include <conio> // Для консольного режиму роботи
#include <vector> // Для роботи з контейнерним класом "Вектор"
using namespace std; // Використання стандартного простору імен
int main()
{
vector<char> vek; // Побудова вектора нульової довжини
// Поміщаємо значення у вектор.
for(int i=0; i<10; i++) vek.push_back('A' + i);
// Отримуємо доступ до вмісту вектора за допомогою індексу.
for(int 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(), то кінець вектора досягнуто.
12.3.2. Вставлення та видалення елементів з вектора
Окрім занесення нових елементів у кінець вектора, у нас є можливість вставляти елементи у середину вектора, використовуючи функцію insert(). Видаляти елементи можна за допомогою функції erase(). Використання функцій insert() і erase() продемонстровано у наведеному нижче коді програми.
Демонстрація механізму вставлення елементів у вектор і видалення їх з нього
#include <vcl>
#include <iostream> // Для потокового введення-виведення
#include <conio> // Для консольного режиму роботи
#include <vector> // Для роботи з контейнерним класом "Вектор"
using namespace std; // Використання стандартного простору імен
int main()
{
vector<char> vek; // Побудова вектора нульової довжини
// Поміщаємо значення у вектор.
for(int i=0; i<10; i++) vek.push_back('A' + i);
// Відображаємо початковий вміст вектора.
cout << "Розмір = " << vek.size() << endl;
cout << "Початковий вміст вектора:" << endl;
for(int 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 << "Вміст вектора після вставлення:" << endl;
for(int 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 << "Вміст вектора після видалення символів:" << endl;
for(int i=0; i<vek.size(); 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
