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


Абстрактные контейнерные типы в качестве параметров


Абстрактные контейнерные типы, представленные в главе 6, также используются для объявления параметров функции. Например, можно определить putValues() как имеющую параметр типа vector<int> вместо встроенного типа массива.

Контейнерный тип является классом и обеспечивает значительно большую функциональность, чем встроенные массивы. Так, vector<int> “знает” собственный размер. В предыдущем подразделе мы видели, что размер параметра-массива неизвестен функции и для его передачи приходится задавать дополнительный параметр. Использование vector<int> позволяет обойти это ограничение. Например, можно изменить определение нашей putValues() на такое:

#include <iostream>

#include <vector>

 

const lineLength =12; // количество элементов в строке

void putValues( vector<int> vec )

{

    cout << "( " << vec.size() << " )< ";

    for ( int i = 0; i < vec.size(); ++1 ) {

        if ( i % lineLength == 0 && i )

            cout << "\n\t"; // строка заполнена

 

    cout << vec[ i ];

    // разделитель, печатаемый после каждого элемента,

    // кроме последнего

    if ( 1 % lineLength != lineLength-1 &&

                 i != vec.size()-1 )

            cout << ", ";

    }

    cout << " >\n";

}

Функция main(), вызывающая нашу новую функцию putValues(), выглядит так:

void putValues( vector<int> );

int main() {

    int i, j[ 2 ];

    // присвоить i и j некоторые значения

    vector<int> vec1(1); // создадим вектор из 1 элемента

    vecl[0] = i;

    putValues( vecl );

 

    vector<int> vec2;    // создадим пустой вектор

    // добавим элементы к vec2

    for ( int ix = 0;

           ix < sizeof( j ) / sizeof( j[0] );

           ++ix )

      // vec2[ix] == j [ix]

      vec2.push_back( j[ix] );

    putValues( vec2 );

    return 0;

}

Заметим, что параметр putValues()передается по значению. В подобных случаях контейнер со всеми своими элементами всегда копируется в стек вызванной функции. Поскольку операция копирования весьма неэффективна, такие параметры лучше объявлять как ссылки.

Как бы вы изменили объявление putValues()?

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

void putValues( const vector<int> & ) { ...




- Начало -  - Назад -  - Вперед -