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




Взаимосвязь массивов и указателей - часть 2


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 );

}

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

#inc1ude <iostream>

template <c1ass e1emType>

void print( elemType *pbegin, elemType *pend )

{

    while ( pbegin != pend ) {

        cout << *pbegin << ' ';

        ++pbegin;

    }

}

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

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 );

}

Мы написали обобщенную функцию. Стандартная библиотека предоставляет набор обобщенных алгоритмов (мы уже упоминали об этом в разделе 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, являющимся объектно-ориентированной реализацией массива.




Содержание  Назад  Вперед