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

22.3.3. Збереження у векторі об'єктів класу

У попередніх прикладах вектори слугували для зберігання значень тільки вбудованих типів, але цим їх можливості не обмежуються. У вектор можна поміщати об'єкти будь-якого типу, в т.ч. об'єкти класів, що створюються програмістом. Розглянемо приклад, у якому вектор використовують для зберігання об'єктів класу kooClass. Звернемо Вашу увагу на те, що у цьому класі визначаються конструктор за замовчуванням і перевантажені версії операторів "<" і "==". Майте на увазі, що, можливо, Вам доведеться визначити і інші оператори порівняння. Це залежить від того, як використовуваний Вами компілятор реалізує бібліотеку STL.

Код програми 22.4. Демонстрація механізму зберігання у векторі об'єктів класу

#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 obj);

friend bool operator<(kooClass a_ob, kooClass b_ob);

friend bool operator==(kooClass a_ob, kooClass b_ob);

};

// Відображаємо координати x, y, z за допомогою оператора

// виведення для класу kooClass.

ostream &operator<<(ostream &stream, kooClass obj)

{

stream << "x= " << obj.x << ", ";

stream << "y= " << obj.y << ", ";

stream << "z= " << obj.z << "\n";

return stream; // Повертає посилання на параметр stream

}

bool operator<(kooClass a_ob, kooClass b_ob)

{

return (a_ob.x + a_ob.y + a_ob.z) < (b_ob.x + b_ob.y + b_ob.z);

}

bool operator==(kooClass a_ob, kooClass b_ob)

{

return (a_ob.x + a_ob.y + a_ob.z) == (b_ob.x + b_ob.y + b_ob.z);

}

int main()

{

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

unsigned int i;

// Додаємо у вектор об'єкти.

for(i=0; i<10; i++) vek.push_back(kooClass(i, i+2, i-3));

cout << "Відображаємо вміст початкового вектора.\n";

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

cout << endl;

// Модифікуємо об'єкти у векторі.

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

cout << "Відображаємо вміст модифікованого вектора.\n";

for(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

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

Вектори забезпечують безпеку зберігання елементів, виявляючи при цьому надзвичайну потужність і гнучкість їх оброблення, але поступаються масивам у ефективності використання. Тому для більшості задач програмування частіше надається перевага звичайним масивам. Проте можливі ситуації, коли унікальні особливості векторів виявляються важливішими за витрати системних ресурсів, пов'язаних з їх використанням.