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

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

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

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

#include iostream

#include vector

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

void putValues( vectorint vec )

{

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

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

if ( i % lineLength == 0 i )

cout " "; // строка заполнена

cout vec[ i ];

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

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

if ( 1 % lineLength != lineLength-1

i != vec.size()-1 )

cout ", ";

}

cout " ";

}

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

void putValues( vectorint );

int main() {

int i, j[ 2 ];

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

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

vecl[0] = i;

putValues( vecl );

vectorint 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 vectorint ) { ...