Программирование >>  Инициализация объектов класса, структура 

1 ... 37 38 39 [ 40 ] 41 42 43 ... 395


6 элементов ia копиртся в ivec

может быть инициализирован с помощью массива встроенного типа:

vector< int > ivec( ia, ia+6 );

Конструктору вектора ivec передаются два указателя - указатель на начало массива ia и на элемент, следующий за последним. В качестве списка начальных значений допустимо

копируются 3 элемента: ia[2], ia[3], ia[4] указать не весь массив, а некоторый его диапазон:

vector< int > ivec( &ia[ 2 ], &ia[ 5 ] );

Еще одним отличием вектора от массива встроенного типа является возможность инициализации одного объекта типа vector другим и использования операции

vector< string > svec; void init and assign()

один вектор инициазируется другим vector< string > user names( svec );

...

один вектор копируется в другой svec = user names;

присваивания для копирования объектов. Например:

Говоря об идиоме STL , м1 подразумеваем совсем другой подход к использованию вектора. Вместо того чтобы сразу задать нужный размер, мы определяем пустой вектор:

vector< string > text;

6 STL расшифровывается как Standard Template Library. До появления стандартной библиотеки С++ классы vector, string и другие, а также обобщенные алгоритмы входили в отдельную библиотеку с названием STL.

класса, то инициатор для них задается конструктором но умолчанию (см. раздел 2.3). Однако инициатор можно задать и явно, используя форму:

vector< int > ivec( 10, -1 );

Все десять элементов вектора будут равны -1. Массив встроенного тина можно явно инициализировать списком:

int ia[ 6 ] = { -2, -1, О, 1, 2, 1024 }; Для объекта класса vector аналогичное действие невозможно. Однако такой объект



string word; while ( cin >> word ) {

text.push back( word ); ...

последовательность строк из стандартного ввода и добавляющего их в вектор:

cout << считаны слова: \n ;

for ( int ix =0; ix <]text.si

for ( int ix =0; ix < text.size(); ++ix ) cout << text[ ix ] << ;

Хотя м1 можем использовать операцию взятия индекса для перебора элементов вектора:

cout << endl;

cout << считаны слова: \n ;

for ( vector<string>::iterator it = text.begin(); it != text.end(); ++it ) cout << *it << ;

более типичным в рамках данной идиомы будет использование итераторов:

cout << endl;

Итератор - это класс стандартной библиотеки, фактически являющийся указателем на элемент массива.

Выражение

*it;

разыменовывает итератор и дает сам элемент вектора. Инструкция

++it;

сдвигает указатель на следующий элемент. Не нужно смешивать эти два подхода. Если следовать идиоме STL при определении пустого вектора:

vector<int> ivec; будет ошибкой написать:

ivec[0] = 1024;

У нас еще нет ни одного элемента вектора ivec; количество элементов выясняется с помощью функции size() .

Затем добавляем к нему элементы при помощи различных функций. Например, функция push back() вставляет элемент в конец вектора. Вот фрагмент кода, считывающего



const int size = 7;

int ia[ size ] = { 0, 1, 1, 2, 3, 5, 8 };

vector< int > ivec( size ); for ( int ix = 0; ix < size; ++ix )

вполне мог бы написать:

ivec.push back( ia[ ix ] );

Имелась в виду инициализация вектора ivec значениями элементов ia, вместо чего получился вектор ivec размера 14.

Следуя идиоме STL, можно не только добавлять, но и удалять элементы вектора. (Все это мы рассмотрим подробно и с примерами в главе 6.)

Упражнение 3.24

int ia[ 7 ] = { 0, 1, 1, 2, 3, 5, 8 };

(a) vector< vector< int

> > ivec;

(b) vector< int > ivec = { 0, 1, 1, 2, 3, 5, 8 };

(c) vector< int > ivec( ia, ia+7 );

(d) vector< string > svec = ivec;

Имеются ли ошибки в следующих определениях?

i (e) vector< string > svec( 10, string( null ));

Упражнение 3.25

bool is ea1( const int*ia, int ia size,

Реализуйте следующую функцию:

const vector<int> &ivec );

Функция is equal () сравнивает поэлементно два контейнера. В случае разного размера контейнеров хвост более длинного в расчет не принимается. Понятно, что, если все сравниваемые элементы равны, функция возвращает true, если отличается хотя бы один - false. Используйте итератор для перебора элементов. Напишите функцию miain(), обращающуюся к is equal ().

3.11. Класс complex

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

Можно допустить и противоположную ошибку. Если мы определили вектор некоторого размера, например:

vector<int> ia( 10 );

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



1 ... 37 38 39 [ 40 ] 41 42 43 ... 395

© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки.
Яндекс.Метрика