- •Введение. Принципы объектно-ориентированного программирования
- •Глава 1. Классы и объекты
- •1.1. Операция разрешения области видимости ::
- •1.2. Перечислимый тип
- •1.3. Модификатор const
- •1.4. Новый тип данных – ссылка &
- •Inline определение_функции
- •2. Определение класса. Сокрытие информации.
- •3. Объект.
- •4. Конструкторы и деструкторы
- •4.1.Назначение конструктора
- •4.2. Конструктор копирования
- •X::X(X&); // где X – имя класса
- •4.3. Деструктор
- •5. Неявный указатель this
- •6. Перегрузка операций
- •7. Примеры перегрузки некоторых операций
- •7.1. Перегрузка операции [ ]
- •7.2. Перегрузка операции ()
- •7.6. Перегрузка операции (тип)
- •8. Дружественность
- •Istream
- •10. Массивы объектов.
- •11. Функции- и классы-шаблоны
- •11.1 Функции-шаблоны (родовые функции)
- •11.2 Классы-шаблоны
- •12. Член-данные класса – объекты другого класса: агрегированные классы.
- •Глава 2. Наследование. Полиморфизм
- •1. Базовый и порожденный классы
- •2. Конструкторы порожденного класса
- •3. Стандартные преобразования при наследовании
- •4. Множественное наследование. Виртуальный базовый класс
- •4.1. Прямые базовые классы
- •4.2. Виртуальный базовый класс
- •5. Полиморфизм, раннее и позднее связывание, виртуальные функции
- •5.1 Раннее (статическое) и позднее (динамическое) связывание
- •5.2. Определение виртуальной функции
- •5.3. Чистая виртуальная функция и абстрактный класс
- •5.4. Правила определения виртуальных функций
- •5.5. Механизм позднего связывания
- •6. Библиотека fstream – работа с файлами
- •Глава 3. Библиотека стандартных шаблонов (бсш). Контейнеры
- •1. Контейнер. Структура бсш.
- •2. Контейнер Vector – динамический массив
- •Контейнер list – список
- •4. Контейнер Set – множество
- •Содержание
- •Глава 1. Классы и объекты
- •Глава 2. Наследование. Полиморфизм
- •Глава 3. Библиотека стандартных шаблонов (бсш). Контейнеры
2. Контейнер Vector – динамический массив
Вектор – самый популярный контейнер. Это массив объектов, основное и замечательное отличие которого от обычных массивов в том, что память, занимаемая массивом объектов, может меняться при выполнении программы. Для обычных массивов это невозможно: либо память выделяется статически при описании int a[100], либо при выполнении программы a = new int [n], а затем изменяться не может (только освободить память и взять заново). В классе вектор имеется 4 конструктора:
vector() – конструктор по умолчанию, пустой вектор;
vector <int> v;
vector( кол-во[, знач.]) – количество элементов со значением знач
vector <char> s(10, ’*’);
vector( итератор_начала, итератор_конца) – инициализация диапозоном
vector(объект_контейнер) – конструктор копирования
vector<char> s1(s);
К элементам вектора можно обращаться по индексу или через итератор (указатель), как и для обычных массивов (a[i] или *(a + i) ).
В классе vector перегружены операции сравнения
== < <= != > >=
и определено 33 ч/функции.
Назовем основные функции:
size( ) – текущий размер массива,
push_back(знач) – поместить значение в конец массива, size() растет,
pop_back( ) – удаляет последний элемент, size() уменьшается,
begin( ) – возвращает итератор начала вектора,
end( ) – возвращает итератор конца вектора,
insert(итератор, значение) – вставляет в массив значение перед элементом, указанным итератором,
erase(итератор) – удаляет элемент, на который указывает итератор, возвращает итератор элемента за удаленным,
clear( ) – удаляет все элементы вектора,
empty( ) – возвращает истину, если вектор пуст, и ложь, если нет.
Заметим, что во всех контейнерах набор перегруженных операций и член-функций практически одинаковый, кроме некоторых специфических для данного класса.
Пример 1. Из созданного массива случайных чисел переписать в другой массив четные числа
#include <iostream.h>
#include <vector.h>
#include <stdlib.h>
#include <conio.h>
void main( )
{ vector <int> v1, v2; // 2 пустых массива
int i,j;
randomize( );
for(i = 0; i < 10; i++)
v1.push_back(random(30)); // поместить в конец – размер растет
cout << "Создан массив:\n";
for(i = 0; i < v1.size( ); i++) // цикл по размеру
cout << v1[i] << ' ';
for(i = 0; i < v1.size( ); i++)
if(v1[i] % 2 == 0) v2.push_back(v1[i]); // добавить в v2 четные
cout << "\nЧетные числа :\n" << v2.size( ) << endl;
for(i = 0; i < v2.size( ); i++) // v2.size( ) – сколько добавили
cout << v2[i] << ' ';
getch( );
}
Пример 2. Из созданного массива случайных чисел удалить нули. Используется итератор.
#include <iostream.h>
#include <vector.h>
#include <stdlib.h>
void main( )
{vector <int> v; int i, j;
randomize( );
for(i = 0; i < 20; i++)
v.push_back(random(5));
cout << "Создан массив:\n";
for(i = 0; i < v.size( ); i++)
cout << v[i] << ' ';
vector <int> :: iterator pv = v.begin( ); // эквивалентно int *pv = v;
while (pv != v.end( ))
{if (*pv == 0)
pv = v.erase(pv); //удалить нуль и сократить массив
else pv++;}
cout << "\n Осталось элементов " << v.size( ) << ":\n";
for(i = 0; i < v.size( ); i++)
cout << v[i] << ' ';
// или используя итератор
/* for(p = v.begin( ); p != v.end( ); p++)
cout << *p << ' ';
*/
}
