- •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.3. Збереження у векторі об'єктів класу
У попередніх прикладах вектори слугували для зберігання значень тільки вбудованих типів, але цим їх можливості не обмежуються. У вектор можна поміщати об'єкти будь-якого типу, в т.ч. об'єкти класів, які створюються програмістом. Розглянемо приклад, у якому вектор використовують для зберігання об'єктів класу kooClass. Зверніть увагу на те, що у цьому класі визначаються конструктор за замовчуванням і перевизначені версії операторів "<" і "==". Майте на увазі, що, можливо, Вам доведеться визначити і інші оператори порівняння. Це залежить від того, як використовуваний Вами компілятор реалізує бібліотеку STL.
Демонстрація механізму зберігання у векторі об'єктів класу
#include <vcl>
#include <iostream> // Для потокового введення-виведення
#include <conio> // Для консольного режиму роботи
#include <vector> // Для роботи з контейнерним класом "Вектор"
using namespace std; // Використання стандартного простору імен
class kooClass { // Оголошення класового типу
int x, y, z; // Тривимірні координати
public:
kooClass() {x = y = z = 0; }
kooClass(int a, int b, int c) {x = a; y = b; z = c; }
// Повертає модифікований об'єкт, адресований покажчиком
kooClass &operator+(int a) { x += a; y += a; z += a; return *this; }
friend ostream &operator<<(ostream &stream, kooClass ObjA);
friend bool operator<(kooClass ObjA, kooClass ObjB);
friend bool operator==(kooClass ObjA, kooClass ObjB);
};
// Відображаємо координати x, y, z за допомогою оператора виведення для класу kooClass.
ostream &operator<<(ostream &stream, kooClass ObjA)
{
stream << "x= " << ObjA.x << ", ";
stream << "y= " << ObjA.y << ", ";
stream << "z= " << ObjA.z << endl;
return stream; // Повертає посилання на параметр stream
}
bool operator<(kooClass ObjA, kooClass ObjB)
{
return (ObjA.x + ObjA.y + ObjA.z) < (ObjB.x + ObjB.y + ObjB.z);
}
bool operator==(kooClass ObjA, kooClass ObjB)
{
return (ObjA.x + ObjA.y + ObjA.z) == (ObjB.x + ObjB.y + ObjB.z);
}
int main()
{
vector<kooClass> vek; // Побудова вектора об'єктів нульової довжини
// Додаємо у вектор об'єкти.
for(int i=0; i<10; i++) vek.push_back(kooClass(i, i+2, i-3));
cout << "Відображаємо вміст початкового вектора" << endl;
for(int i=0; i<vek.size(); i++) cout << i << " ==> " << vek[i];
cout << endl;
// Модифікуємо об'єкти у векторі.
for(int i=0; i<vek.size(); i++) vek[i] = vek[i] + 10;
cout << "Відображаємо вміст модифікованого вектора" << endl;
for(int i=0; i<vek.size(); i++) cout << i << " ==> " << vek[i];
getch(); return 0;
}
Внаслідок виконання ця програма відображає на екрані такі результати:
Відображаємо вміст початкового вектора.
0 ==> x= 0, y= 2, z= -3
1 ==> x= 1, y= 3, z= -2
2 ==> x= 2, y= 4, z= -1
3 ==> x= 3, y= 5, z= 0
4 ==> x= 4, y= 6, z= 1
5 ==> x= 5, y= 7, z= 2
6 ==> x= 6, y= 8, z= 3
7 ==> x= 7, y= 9, z= 4
8 ==> x= 8, y= 10, z= 5
9 ==> x= 9, y= 11, z= 6
Відображаємо вміст модифікованого вектора.
0 ==> x= 10, y= 12, z= 7
Внаслідок виконання ця програма відображає на екрані такі результати:
Відображаємо вміст початкового вектора.
0 ==> x= 0, y= 2, z= -3
1 ==> x= 1, y= 3, z= -2
2 ==> x= 2, y= 4, z= -1
3 ==> x= 3, y= 5, z= 0
4 ==> x= 4, y= 6, z= 1
5 ==> x= 5, y= 7, z= 2
6 ==> x= 6, y= 8, z= 3
7 ==> x= 7, y= 9, z= 4
8 ==> x= 8, y= 10, z= 5
9 ==> x= 9, y= 11, z= 6
Відображаємо вміст модифікованого вектора.
0 ==> x= 10, y= 12, z= 7
1 ==> x= 11, y= 13, z= 8
2 ==> x= 12, y= 14, z= 9
3 ==> x= 13, y= 15, z= 10
4 ==> x= 14, y= 16, z= 11
5 ==> x= 15, y= 17, z= 12
6 ==> x= 16, y= 18, z= 13
7 ==> x= 17, y= 19, z= 14
8 ==> x= 18, y= 20, z= 15
9 ==> x= 19, y= 21, z= 16
Вектори забезпечують надійне зберігання елементів, виявляючи при цьому надзвичайну потужність і гнучкість їх оброблення, але поступаються масивам у ефективності використання. Тому для більшості задач програмування частіше надається перевага звичайним масивам. Проте можливі ситуації, коли унікальні особливості векторів виявляються важливішими за витрати системних ресурсів, пов'язаних з їх використанням.
