Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
C++ для начинающих (Стенли Липпман) 3-е хххх.pdf
Скачиваний:
84
Добавлен:
30.05.2015
Размер:
5.92 Mб
Скачать

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

681

арифметические операции над указателями приходится программировать самостоятельно.

Мы объявляем обе функции статическими членами класса:

class Account { public:

// ...

static Account* init_heap_array( vector<value_pair> &init_values, vector<value_pair>::size_type elem_count = 0 ); static void dealloc_heap_array( Account*, size_t );

// ...

typedef pair<char*, double> value_pair; };

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

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

vector< Point > vec( 5 );

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

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

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

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

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

Point pa[ 5 ];

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

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

5 Сигнатура ассоциированного конструктора имеет следующий смысл.

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

explicit vector( size_type n, const T& value=T(), const Allocator&=Allocator());

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

682

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 (векторов).

Вставка объекта в любой из этих контейнеров осуществляется с помощью копирующего конструктора.

Упражнение 14.9

Какие из приведенных инструкций неверны? Исправьте их.

(b)Account iA[1024] = {

"Nhi", "Le", "Jon", "Mike", "Greg", "Brent", "Hank"

(a) Account *parray[10] = new Account[10];

"Roy", "Elena" };

(d) string as[] = *ps;

(c) string *ps=string[5]("Tina","Tim","Chyuan","Mira","Mike");

Упражнение 14.10

Что лучше применить в каждой из следующих ситуаций: статический массив (такой, как Account pA[10]), динамический массив или вектор? Объясните свой выбор.

Внутри функции Lut() нужен набор из 256 элементов для хранения объектов класса Color. Значения являются константами.

Необходимо хранить набор из неизвестного числа объектов класса Account. Данные счетов читаются из файла.

Функция gen_words(elem_size) должна сгенерировать и передать обработчику текста набор из elem_size строк.

Упражнение 14.11