Можно ли создать вектор из векторов на C++?

Двумерный вектор в C++ Программирование и разработка

Да, вы можете создать вектор из векторов на C ++. Вектор нормали — это одномерная структура данных списка. Вектор векторов — это двумерная структура данных списка из двух нормальных векторов. Двумерный список — это таблица без правильной строки заголовка и без правильного столбца заголовка. Вектор векторов — это один вектор, в который вложены другие векторы. Аргумент шаблона для внешнего вектора — это вектор. Итак, вектор векторов может быть только одного типа, например, все целые числа или все символы.

В этой статье объясняется, как создать вектор векторов и как применить некоторые очевидные функции-члены вектора к вектору векторов. Для этого программа на C ++ должна начинаться с:

#include <iostream>
#include <vector>
using namespace std;

Обратите внимание на наличие векторной библиотеки.

Construction

Построение вектора нормали начинается с:

vector<type> name

Имя — это имя вектора. Следующий код создает одномерный вектор со списком инициализации в фигурных скобках из 5 символов:

vector<char> vtr = {‘A’, ‘B’, ‘C’, ‘D’, ‘E’};

Чтобы построить вектор векторов, начните с:

vector<vector<type>> name

Обратите внимание, как векторный шаблон стал еще одним аргументом шаблона. Таким образом, его следует интерпретировать как вектор однотипных векторов. Имя — это имя вектора векторов. Следующий код создает двумерный вектор с 6 заключенными в скобки списками инициализации по 5 символов в каждом для 6 строк.

vector<vector<char>> vtr = {{‘A’, ‘B’, ‘C’, ‘D’, ‘E’},

{‘A’, ‘B’, ‘C’, ‘D’, ‘E’},

{‘A’, ‘B’, ‘C’, ‘D’, ‘E’},

{‘A’, ‘B’, ‘C’, ‘D’, ‘E’},

{‘A’, ‘B’, ‘C’, ‘D’, ‘E’},

{‘A’, ‘B’, ‘C’, ‘D’, ‘E’}};

Внешний векторный литерал имеет разделители, {и}. Каждый вектор для строки имеет разделители, {и}. Литералы вектора-строки разделяются запятыми. Конечная точка с запятой находится в правом нижнем углу создаваемой таблицы. 2D-вектор также можно было создать следующим образом:

vector<char> oneDV = {‘A’, ‘B’, ‘C’, ‘D’, ‘E’};
vector<vector<char>> twoDV = {oneDV, oneDV, oneDV, oneDV, oneDV, oneDV};

То есть создается одномерный вектор, и его имя переменной используется в качестве идентификаторов для разных строк.

Теперь строки могут иметь разное содержимое. В этом случае каждая строка будет отдельным вектором с другим именем.

Доступ с помощью индексов

Синтаксис доступа к элементу:

2DvectorName[i][j]

Где i — это переменная для конкретной строки, а j — это переменная для определенного столбца. Подсчет строк начинается с нуля, и подсчет столбцов также начинается с нуля. Двумерный вектор векторов не обязательно должен быть регулярным; то есть количество столбцов в каждой строке не обязательно должно быть одинаковым. Следующий код считывает значение строки индекса 2 (третья строка) и столбца индекса 3 (четвертый столбец):

vector<vector<char>> vtr = {{‘A’, ‘B’, ‘C’, ‘D’, ‘E’},

{‘A’, ‘B’, ‘C’, ‘D’, ‘E’},

{‘A’, ‘B’, ‘C’, ‘D’, ‘E’},

{‘A’, ‘B’, ‘C’, ‘D’, ‘E’},

{‘A’, ‘B’, ‘C’, ‘D’, ‘E’},

{‘A’, ‘B’, ‘C’, ‘D’, ‘E’}};

char ch = vtr[2][3];

cout << ch << endl;

На выходе получается «D».

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

vtr[2][3] = ‘Z’;

char ch = vtr[2][3];

cout << ch << endl;

В этом случае на выходе будет «Z».

Последовательный доступ

Доступ к первой строке можно получить, начиная с первого элемента, затем второго элемента, затем третьего элемента до последнего элемента первой строки. Затем таким же образом можно получить доступ к следующей строке, затем к следующей, а затем к следующей, пока не будет завершена последняя строка. Для этого нужны два цикла for, как показано в следующем коде:

    vectoroneDV = {‘A’, ‘B’, ‘C’, ‘D’, ‘E’};
vector<vector>twoDV = {oneDV, oneDV, oneDV, oneDV, oneDV, oneDV};

for (int i=0; i<twoDV.size(); i++) {
for (int j=0; j<twoDV[i].size(); j++) {
cout<<twoDV[i][j] << ‘ ‘;
}
cout<<endl;
}
cout<<endl;

Результат:

A B C D E

A B C D E

A B C D E

A B C D E

A B C D E

A B C D E

Обратите внимание, что twoDV.size () дает количество строк для всей таблицы, а twoDV [i].size () дает количество ячеек (столбцов) для конкретной строки.

Вставка строки

Вставка на передний план

Строка относится к двумерному вектору, как ячейка — к одномерному вектору. Используется тот же метод вставки, но вместо литерала ячейки используется литерал строки; вместо идентификатора значения используется идентификатор строки (например, twoDV [i]). Следующий код показывает, как строка вставляется перед двумерным вектором:

vector<vector>twoDV = {{‘A’, ‘B’, ‘C’, ‘D’, ‘E’},
{‘A’, ‘B’, ‘C’, ‘D’, ‘E’},
{‘A’, ‘B’, ‘C’, ‘D’, ‘E’},
{‘A’, ‘B’, ‘C’, ‘D’, ‘E’}};

vector<vector>::iterator p = twoDV.begin();

vectoroneDV = {‘*’, ‘$’, ‘%’, ‘$’, ‘&’};

twoDV.insert(p, oneDV);

for (int i=0; i<twoDV.size(); i++) {
for (int j=0; j<twoDV[i].size(); j++) {
cout<<twoDV[i][j] << ‘ ‘;
}
cout<<endl;
}
cout<<endl;

Результат:

* $ % $ &amp;

A B C D E

A B C D E

A B C D E

A B C D E

Функция-член begin () возвращает итератор, указывающий на первую строку 2D-вектора. Обратите внимание, что возвращаемый итератор должен быть векторов типа (например, vector > :: iterator p). Вставка происходит перед тем местом, куда указывает итератор.

Вставка внутрь

Следующий код вставляет строку в таблицу перед указанной третьей строкой:

vector<vector>twoDV = {{‘A’, ‘B’, ‘C’, ‘D’, ‘E’},
{‘A’, ‘B’, ‘C’, ‘D’, ‘E’},
{‘A’, ‘B’, ‘C’, ‘D’, ‘E’},
{‘A’, ‘B’, ‘C’, ‘D’, ‘E’}};

vector<vector>::iterator p = twoDV.begin();
p++; p++;

vectoroneDV = {‘*’, ‘$’, ‘%’, ‘$’, ‘&’};

twoDV.insert(p, oneDV);

for (int i=0; i<twoDV.size(); i++) {
for (int j=0; j<twoDV[i].size(); j++) {
cout<<twoDV[i][j] << ‘ ‘;
}
cout<<endl;
}
cout<<endl;

Результат:

A B C D E

A B C D E

* $ % $ &

A B C D E

A B C D E

Итератор был увеличен дважды, чтобы указать на третью строку перед вставкой. Оператор вставки также мог быть записан как,

twoDV.insert(p, {‘*’, ‘$’, ‘%’, ‘$’, ‘&’});

Результат был бы таким же.

Добавление строки

Строку можно добавить с помощью одномерной функции push_back (). Следующий код иллюстрирует это:

vector<vector>twoDV = {{‘A’, ‘B’, ‘C’, ‘D’, ‘E’},
{‘A’, ‘B’, ‘C’, ‘D’, ‘E’},
{‘A’, ‘B’, ‘C’, ‘D’, ‘E’},
{‘A’, ‘B’, ‘C’, ‘D’, ‘E’}};

vectoroneDV = {‘*’, ‘$’, ‘%’, ‘$’, ‘&’};

twoDV.push_back(oneDV);

for (int i=0; i<twoDV.size(); i++) {
for (int j=0; j<twoDV[i].size(); j++) {
cout<<twoDV[i][j] << ‘ ‘;
}
cout<<endl;
}
cout<<endl;

Результат:

A B C D E

A B C D E

A B C D E

A B C D E

* $ % $ &

Оператор push_back () также мог быть записан как,

twoDV.push_back({‘*’, ‘$’, ‘%’, ‘$’, ‘&’});

Результат был бы таким же.

Стирание строк

В следующем коде используется одномерная функция-член вектора erase () для стирания второй и третьей строк, хотя второй итератор указывает на четвертую строку 5-строчного вектора векторов:

vector<vector>twoDV = {{‘A’, ‘B’, ‘C’, ‘D’, ‘E’},
{‘A’, ‘B’, ‘C’, ‘D’, ‘E’},
{‘A’, ‘B’, ‘C’, ‘D’, ‘E’},
{‘A’, ‘B’, ‘C’, ‘D’, ‘E’},
{‘A’, ‘B’, ‘C’, ‘D’, ‘E’}};

vector<vector>::iterator p = twoDV.begin();
p++;
vector<vector>::iterator q = twoDV.end();
q—; q—;

twoDV.erase(p, q);

for (int i=0; i<twoDV.size(); i++) {
for (int j=0; j<twoDV[i].size(); j++) {
cout<<twoDV[i][j] << ‘ ‘;
}
cout<<endl;
}
cout<<endl;

Результат:

A B C D E

A B C D E

A B C D E

Функция-член одномерного вектора end () возвращает итератор, который указывает сразу после конца одномерного вектора (который теперь является вектором векторов). В приведенном выше коде он уменьшается дважды, чтобы указать на предпоследнюю строку. Каждый раз, когда необходимо стереть диапазон элементов или строк, элемент или строка, на которые указывает второй итератор, не стирается.

Clear

Элемент относится к одномерному вектору, как строка к двумерному вектору (вектору векторов). Все строки вектора можно стереть с помощью одномерной функции-члена clear (). Следующий код иллюстрирует это:

vector<vector>twoDV = {{‘A’, ‘B’, ‘C’, ‘D’, ‘E’},
{‘A’, ‘B’, ‘C’, ‘D’, ‘E’},
{‘A’, ‘B’, ‘C’, ‘D’, ‘E’},
{‘A’, ‘B’, ‘C’, ‘D’, ‘E’},
{‘A’, ‘B’, ‘C’, ‘D’, ‘E’}};
twoDV.clear();

for (int i=0; i<twoDV.size(); i++) {
for (int j=0; j<twoDV[i].size(); j++) {
cout<<twoDV[i][j] << ‘ ‘;
}
cout<<endl;
}
cout<<endl;

На выходе ничего нет.

Заключение

Элемент относится к одномерному вектору, как строка к двумерному вектору (вектору или векторам). Все одномерные функции-члены для одномерного вектора могут использоваться для двумерного вектора, обращаясь к строкам, а не к элементам. Доступ к отдельным ячейкам таблицы можно получить с помощью twoDV [i] [j], где twoDV, i и j имеют общие значения. К вектору строк можно обращаться с помощью twoDV, а к каждой строке можно обращаться с помощью twoDV [i].

Читайте также:  Python OpenCV — морфологические операции
Оцените статью
bestprogrammer.ru
Добавить комментарий