3.10. Класс vectorИспользование класса vector (см. раздел 2.8) является
альтернативой применению встроенных массивов. Этот класс предоставляет гораздо
больше возможностей, поэтому его использование предпочтительней. Однако встречаются
ситуации, когда не обойтись без массивов встроенного типа. Одна из таких ситуаций
– обработка передаваемых программе параметров командной строки, о чем мы будем
говорить в разделе 7.8. Класс vector, как и класс string,
является частью стандартной библиотеки С++. #include <vector> Существуют два абсолютно разных подхода к использованию вектора, назовем их идиомой массива и идиомой STL. В первом случае объект класса vector используется точно так же, как массив встроенного типа. Определяется вектор заданной размерности: vector< int > ivec( 10 ); что аналогично определению массива встроенного типа: int ia[ 10 ]; Для доступа к отдельным элементам вектора применяется операция взятия индекса: void simple_example() { const int elem_size = 10; vector< int > ivec( elem_size ); int ia[ elem_size ]; for ( int ix = 0; ix < elem_size; ++ix ) Мы можем узнать размерность вектора, используя функцию size(), и проверить, пуст ли вектор, с помощью функции empty(). Например: void print_vector( vector<int> ivec ) { if ( ivec.empty() ) return; for ( int ix=0; ix< ivec.size(); ++ix ) Элементы вектора инициализируются значениями по умолчанию. Для числовых типов и указателей таким значением является 0. Если в качестве элементов выступают объекты класса, то инициатор для них задается конструктором по умолчанию (см. раздел 2.3). Однако инициатор можно задать и явно, используя форму: vector< int > ivec( 10, -1 ); Все десять элементов вектора будут равны -1. int ia[ 6 ] = { -2, -1, О, 1, 2, 1024 }; Для объекта класса vector аналогичное действие невозможно. Однако такой объект может быть инициализирован с помощью массива встроенного типа: // 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 ); // ... // один вектор копируется в другой Говоря об идиоме STL , мы подразумеваем совсем другой подход к использованию вектора. Вместо того чтобы сразу задать нужный размер, мы определяем пустой вектор: vector< string > text; Затем добавляем к нему элементы при помощи различных функций. Например, функция push_back()вставляет элемент в конец вектора. Вот фрагмент кода, считывающего последовательность строк из стандартного ввода и добавляющего их в вектор: string word; while ( cin >> word ) { text.push_back( word ); // ... } Хотя мы можем использовать операцию взятия индекса для перебора элементов вектора: cout << "считаны слова: \n"; for ( int ix =0; ix < text.size(); ++ix ) cout << text[ ix ] << ' '; cout << endl; более типичным в рамках данной идиомы будет использование итераторов: cout << "считаны слова: \n"; for ( vector<string>::iterator it = text.begin(); it != text.end(); ++it ) cout << *it << ' '; cout << endl; Итератор – это класс стандартной библиотеки, фактически являющийся указателем
на элемент массива. *it; разыменовывает итератор и дает сам элемент вектора. Инструкция 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. Упражнение 3.24Имеются ли ошибки в следующих определениях? (a) vector< vector< int > > ivec; Упражнение 3.25Реализуйте следующую функцию: Содержание |
Нет комментариев. Оставить комментарий: |