Программирование. Принципы и практика использования C++ Исправленное издание, стр. 256
19.2.6. Предыдущая версия класса vector
Итак, мы получили почти реальный класс
vectordouble// почти реальный вектор чисел типа doubleclass vector {/* инвариант: для 0<=n<sz значение elem[n] является n- м элементом sz<=space; если sz<space, то после elem[sz–1] есть место для (space–sz) чисел типа double*/ int sz; // размер double* elem; // указатель на элементы (или 0) int space; // количество элементов плюс количество слотовpublic: vector():sz(0),elem(0),space(0) { } explicit vector(int s):sz(s),elem(new double[s]),space(s) { for (int i=0; i<sz; ++i) elem[i]=0; // элементы // инициализированы } vector(const vector&); // копирующий конструктор vector& operator=(const vector&); // копирующее присваивание ~vector() { delete[] elem; } // деструктор double& operator[ ](int n) { return elem[n]; } // доступ const double& operator[](int n) const { return elem[n]; } int size() const { return sz; } int capacity() const { return space; } void resize(int newsize); // увеличение void push_back(double d); void reserve(int newalloc);};Обратите внимание на то, что этот класс содержит все основные операции (см. раздел 18.3): конструктор, конструктор по умолчанию, копирующий конструктор, деструктор. Он также содержит операции для доступа к данным (индексирование
[]size()capacity()resize()push_back()reserve()19.3. Шаблоны
Однако нам мало иметь вектор, состоящий из чисел типа
doublevector<double>vector<int>vector<Month>vector<Window*> // вектор указателей на объекты класса Windowvector< vector<Record> > // вектор векторов из объектов класса Recordvector<char>
vectorsort()
19.3.1. Типы как шаблонные параметры
vectorvectordoubleTTdoubleintstringTtemplate<class T>TРассмотрим пример.
// почти реальный вектор элементов типа Ttemplate<class T> class vector { // читается как "для всех типов T" (почти так же, как // в математике) int sz; // размер T* elem; // указатель на элементы int space; // размер + свободная памятьpublic: vector():sz(0),elem(0),space(0) { } explicit vector(int s); vector(const vector&); // копирующий конструктор vector& operator=(const vector&); // копирующее присваивание