С++ для начинающих


     Форстерит на сайте http://redkiekamni.ru. |     

Вектор объектов


Когда определяется вектор из пяти объектов класса, например:

vector< Point > vec( 5 );

то инициализация элементов производится в следующем порядке5:

1.      С помощью конструктора по умолчанию создается временный объект типа класса, хранящегося в векторе. .

2.      К каждому элементу вектора применяется копирующий конструктор, в результате чего каждый объект инициализируется копией временного объекта.

3.      Временный объект уничтожается.

Хотя конечный результат оказывается таким же, как при определении массива из пяти объектов класса:

Point pa[ 5 ];

эффективность подобной инициализации вектора ниже, так как, во-первых, на конструирование и уничтожение временного объекта, естественно, нужны ресурсы, а во-вторых, копирующий конструктор обычно оказывается вычислительно более сложным, чем конструктор по умолчанию.

Общее правило проектирования таково: вектор объектов класса удобнее только для вставки элементов, т.е. в случае, когда изначально определяется пустой вектор. Если мы заранее вычислили, сколько придется вставлять элементов, или имеем на этот счет обоснованное предположение, то надо зарезервировать необходимую память, а затем приступать к вставке. Например:

vector< Point > cvs;   // пустой

int cv_cnt = calc_control_vertices();

// зарезервировать память для хранения cv_cnt объектов класса Point

// cvs все еще пуст ...

cvs.reserve( cv_cnt );

// открыть файл и подготовиться к чтению из него

ifstream infile( "spriteModel" );

istream_iterator<Point> cvfile( infile ),eos;

// вот теперь можно вставлять элементы

copy( cvfile, eos, inserter( cvs, cvs.begin() ));

(Алгоритм copy(), итератор вставки inserter и потоковый итератор чтения istream_iterator рассматривались в главе 12.) Поведение объектов list (список) и deque (двусторонняя очередь) аналогично поведению объектов vector (векторов). Вставка объекта в любой из этих контейнеров осуществляется с помощью копирующего конструктора.



Содержание  Назад  Вперед