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

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


#include <iostream> int main()

int ia[9] = { 0, 1, 1, 2, 3, 5, 8, 13, 21 };

int *pbegin = ia;

предыдущем разделе, или с помощью указателей. Например:

) {

pbegin <<;

++pbegin;

int *pend = ia + 9;

while ( pbegin != pend cout << *pbegin <<;

Указатель pbegin инициализируется адресом первого элемента массива. Кажд1й проход по циклу увеличивает этот указатель на 1, что означает смещение его на следующий элемент. Как понять, где остановиться? В нашем примере мы определили второй указатель pend и инициализировали его адресом, следующим за последним элементом массива ia. Как только значение pbegin станет равным pend, мы узнаем, что массив кончился.

Перепишем эту программу так, чтобы начало и конец массива передавались параметрами

#inc1ude <iostream>

void ia print( int *pbegin, int *pend ) {

while ( pbegin != pend ) { cout << *pbegin << ; ++pbegin;

int main() {

int ia[9] = { 0, 1, 1, 2, 3, 5, 8, 13, 21 };

ia print( ia, ia + 9 );

в некую обобщенную функцию, которая умеет печатать массив любого размера:

Отметим разницу в выражениях:

*ia+1

*(ia+1);

Операция разыменования имеет более высокий приоритет, чем операция сложения (о приоритетах операций говорится в разделе 4.13). Поэтому первое выражение сначала разыменовывает переменную ia и получает первый элемент массива, а затем прибавляет к нему 1 . Второе же выражение доставляет значение второго элемента.

Проход по массиву можно осуществлять с помощью индекса, как мы делали это в



#inc1ude <iostream>

template <c1ass e1emType> void print( elemType *pbegin,

elemType *pend )

while

pbegin != pend ) { cout << *pbegin << ; ++pbegin;

функцию в шаблон (шаблоны были вкратце нредставлены в разделе 2.5):

int main() {

int ia[9] = { 0, 1, 1, 2, 3, 5, 8, 13, 21 double da[4] = { 3.14, 6.28, 12.56, 25.12 } string sa[3] = { piglet , eeyore , pooh };

print( ia, ia+9 print( da, da+4 print( sa, sa+3

Теперь мы можем вызывать нашу функцию print() для печати массивов любого типа:

Mi написали обобщенную функцию. Стандартная библиотека предоставляет набор обобщенных алгоритмов (мы уже упоминали об этом в разделе 3.4), реализованных подобным образом. Параметрами таких функций являются указатели на начало и конец массива, с которым они производят определенные действия. Вот, например, как выглядят

#include <a1gorithm> int main()

int ia[6] = { 107, 28, 3, 47, 104, 76 }; string sa[3] = { piglet , eeyore , pooh };

sort( ia, ia+6 ); sort( sa, sa+3 );

вызовы обобщенного алгоритма сортировки:

(Мы подробно остановимся на обобщенных алгоритмах в главе 12; в Приложении будут приведены примеры их использования.)

В стандартной библиотеке С++ содержится набор классов, которые инкапсулируют использование контейнеров и указателей. (Об этом говорилось в разделе 2.8.) В следующем разделе мы займемся стандартным контейнерным типом vector, являющимся объектно-ориентированной реализацией массива.

Наша функция стала более универсальной, однако, она умеет работать только с массивами типа int. Есть способ снять и это ограничение: преобразовать данную



void simp1e examp1e()

const int e1em size = 10; vector< int > ivec( e1em size ); int ia[ e1em size ];

for ( int ix = 0; ix < e1em size; ++ix ) ia[ ix ] = ivec[ ix ];

Для доступа к отдельным элементам вектора применяется операция взятия индекса:

Мы можем узнать размерность вектора, используя функцию size() , и проверить, пуст ли

void print vector( vector<int> ivec ) {

if ( ivec.empty() ) return;

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

вектор, с помощью функции empty() . Например:

Элементы вектора инициализируются значениями по умолчанию. Для числовых типов и указателей таким значением является 0. Если в качестве элементов выступают объекта:

3.10. Класс vector

Использование класса vector (см. раздел 2.8) является альтернативой применению встроенных массивов. Этот класс предоставляет гораздо больше возможностей, поэтому его использование предпочтительней. Однако встречаются ситуации, когда не обойтись без массивов встроенного типа. Одна из таких ситуаций - обработка передаваемых программе параметров командной строки, о чем мы будем говорить в разделе 7.8. Класс vector, как и класс string, является частью стандартной библиотеки С++.

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

#include <vector>

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

vector< int > ivec( 10 ); что аналогично определению массива встроенного типа:

int ia[ 10 ];



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

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