|
Программирование >> Инициализация объектов класса, структура
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 ); то вставка элементов увеличивает его размер, добавляя новые элементы к существующим. Хотя это и кажется очевидным, тем не менее, начинающий программист
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |