Class vector
{ T *ms;
int size;
public:
vector() : size(0),ms(NULL) {}
~vector(){delete [] ms;}
void inkrem(const T &t) // увеличение размера массива на 1 элемент
{ T *tmp = ms;
ms=new T[size+1]; // ms − указатель на новый массив
if(tmp) memcpy(ms,tmp,sizeof(T)*size); // перезапись tmp -> ms
ms[size++]=t; // добавление нового элемента
if(tmp) delete [] tmp; // удаление временного массива
}
void decrem(void) // уменьшение размера массива на 1 элемент
{ T *tmp = ms;
if(size>1) ms=new T[--size];
if(tmp)
{ memcpy(ms,tmp,sizeof(T)*size); // перезапись без последнего
// элемента
delete [] tmp; // удаление временного массива
}
}
T &operator[](int ind) // определение обычного метода
{ // if(ind<0 || (ind>=size)) throw IndexOutOfRange; // возбуждение
// исключительной ситуации IndexOutOfRange
return ms[ind];
}
};
int main()
{ vector <int> VectInt;
vector <double> VectDouble;
VectInt. inkrem(3);
VectInt. inkrem(26);
VectInt. inkrem(12); // получен int-вектор из 3 атрибутов
VectDouble. inkrem(1.2);
VectDouble. inkrem(.26);//получен double-вектор из 2 атрибутов
int a=VectInt[1]; // a = ms[1]
cout << a << endl;
int b=VectInt[4]; // будет возбуждена исключительная ситуация
cout << b << endl; // но не обработана
double d=VectDouble[0];
cout << d << endl;
VectInt[0]=1;
VectDouble[1]=2.41;
return 0;
}
Класс vector наряду с конструктором и деструктором имеет 2 функции: increm – добавление в конец вектора нового элемента, dekrem – уменьшение числа элементов на единицу и операция [] обращения к i-му элементу вектора.
Параметр шаблона vector – любой тип, у которого определены операция присваивания и операция new. Например, при задании объекта типа vector <int> происходит генерация конкретного класса из шаблона и конструирование соответствующего объекта VectInt, при этом тип Т получает значение типа int. Генерация конкретного класса означает, что генерируются все его компоненты-функции, что может привести к существенному увеличению кода программы.
Выполнение функций
VectInt.increm(3);
VectInt.increm(26);
VectInt.increm(12);
приведет к созданию вектора (массива) из трех атрибутов (3, 26 и 12).
Сгенерировать конкретный класс из шаблона можно, явно записав:
template vector<int>;
При этом не будет создано никаких объектов типа vector<int>, но будет сгенерирован класс со всеми его компонентами.
В некоторых случаях желательно описания некоторых компонент-функций шаблона класса выполнить вне тела шаблона, например:
#include <iostream >
using namespace std;
template <class T1,class T2>
T1 sm1(T1 aa,T2 bb) // описание шаблона глобальной
{ return (T1)(aa+bb); // функции суммирования значений
} // двух аргументов
template <class T1,class T2>