Информатика: Методические указания к лабораторным работам № 1-5. Функции. Обработка символьных данных. Организация работы с файлами, страница 12

for(i=0; i<v.size(); i++) cout << v[i] << " ";

Результат

Размер = 10

Исходное содержание вектора:

A  B  C  D  E  F  G  H  I  J
Размер вектора после вставки = 20
Содержимое вектора после вставки:
A  B  X  X  X  X  X  X  X  X  X  X  C  D  E  F  G  H  I  J
Размер вектора после удаления символов = 10

Содержимое вектора после удаления символов:

A  B  C  D  E  F  G  H  I  J

Многомерные векторы

Статический массив в соответствии с синтаксисом языка есть массив массивов, т. е. массив, элементами которого служат массивы.

Аналогично многомерный вектор – это вектор векторов, т. е. вектор, элементами которого будут векторы.

Пример 7

/*Создание двумерного вектора (матрицы) целого типа при неизвестном количестве строк и столбцов*/

vector<vector<int>> dvec;

// Инициализация матрицы

intN, M;

cout<<”Введите число строк и столбцов”;

cin>>N, M;

for(int i = 0; i < N; i++)

{

vector<int> vec; // Это строка-вектор

for(int j = 0; j < M; j++)

vec.push_back(i); // Заполняем очередную строку

dvec.push_back(vec); // Загружаем в матрицу очередную строку

}

Если количество строк N и количество столбцов M матрицы нам известны, то для создания матрицы надо использовать конструкцию

int N, M;

...........

vector< vector<int> > matrix(N, vector<int>(M));

// Между двумя угловыми скобками обязательно должен быть пробел!

Инициализировать такую матрицу можно обычным способом:

for (int i=0; i<N; i++)

   for ( int j=0; j<M; j++)

        matrix[i][j]=rand()%5;

Таким образом, данная матрица состоит изN строк, а каждая строка – это вектор из M элементов, т. е. со строками матрицы можно работать как с обычными одномерными векторами, используя весь аппарат STL. Если вы будете вставлять в строку или удалять из нее элементы, то размер строки будет меняться.

Значит, в отличие от статических массивов в двумерном векторе (матрице) количество элементов в строках может быть разным.

Вектор может быть параметром функции и может возвращаться в виде результата работы функции.

Контейнеры STL всегда копируются при любых попытках передать их в качестве параметра.

Таким образом, если вы передаете вектор из миллиона элементов функции, описанной следующим образом:

voidfunction(vector<int> v){ // Старайтесь никогда так не делать ...}

то весь миллион элементов будет скопирован в другой, временный, вектор, который будет освобожден при выходе из функции function. Если эта функция вызывается в цикле, о производительности программы можно забыть сразу.

Если вы не хотите, чтобы контейнер создавал временный вектор каждый раз при вызове функции, используйте передачу параметра по ссылке. Хорошим тоном считается использование при этом модификатора const, если функция не намерена изменять содержимое контейнера.

void function(const vector<int>& v) { // OK ...}

Если содержимое контейнера может измениться по ходу работы функции, то модификатор const писать не следует:

int(vector<int>& v) { // Так держать

v[0]++; }

Двумерный вектор, так же как и одномерный, передаются в функцию по ссылке.

Пример 8

................

void function(vector<vector<int> > &dvec)// Формальный параметр –

{    for(inti = 0; i < 4; i++)                 // ссылка на двумерный вектор

{vector<int> vec;              // Это вектор-строка

for(int j = 0; j < 5;j++)

       vec.push_back(i); // Заполняем очередную строку

dvec.push_back(vec); // Заносим очередную строку в матрицу

}

}

    void main()

 vector<vector<int>> dv;

        function(dv);

        for(int i = 0; i < dv.size(); i++)// dv.size()числострок

{ for(int j = 0; j < dv[i].size(); j++)// dv[i].size()числоэлементов

          // в i-й строке

            cout << dv[i][j] << " ";

            cout << "\n";

}

Результат

0  0  0  0  0

1  1  1  1  1

2  2  2  2  2

3  3  3  3  3

Алгоритмы  STL