Назад Зміст Вперед

Як створити вектор векторів

vector < vector <тип даних > >

А щоб вказати кількість векторів у векторі, нам знадобиться — метод resize().

vector < vector <int> >vec; 
vec.resize(10);  // десять векторів

Але є ще один спосіб додавання векторів у вектор. Для цього способу ми будемо використовувати функцію push_back()

vec.push_back(vector <int>());

В аргументах функції push_back() знаходиться — ім’я контейнера, який ми хочемо додати. У нашому випадку — vector.

Далі йде тип контейнера — <тип>. І все закінчується відкриваючою та закриваючою дужкою ().

Для двовимірного вектора теж можна вказати значення ще під час ініціалізації:

vector <vector <int> > ivector = {{1, 4, 7},{2, 5, 8},{3, 6, 9}};

Приклад 1.

Програма (ввід з клавіатури)

/*******************************************************************************
 Вектори
 ********************/
#include <iostream>
#include <vector>    // Для роботи з векторами
using namespace std;

int main() {
    int n, m;    // Змінні для розмірів вектора
    cout << "Введіть розмір вектора (рядки стовпці): " << endl;
    cin >> n >> m;  // Введення розмірів
    
    // Оголошення двовимірного вектора розміром n x m
    vector<vector<int>> a(n, vector<int>(m));
    
    // Заповнення вектора значеннями
    for (int i = 0; i < n; i++) {    // Цикл по рядкам
        for (int j = 0; j < m; j++) { // Цикл по стовпцям
            cin >> a[i][j]; // Введення значення
        }
    }
    
    cout << "Двовимірний масив:" << endl;
    
    // Виведення вектора
    for (int i = 0; i < n; i++) {    // Цикл по рядкам
        for (int j = 0; j < m; j++) { // Цикл по стовпцям
            cout << a[i][j] << " "; // Виведення значення
        }
        cout << endl; // Перехід на новий рядок
    }
    
    return 0;
}

Результат:

Приклад 2.

Програма (ініціалізація векторів)

/*******************************
 **Вектори**
 *******************************/
#include <iostream>
#include <vector>    // Для роботи з векторами
using namespace std;

int main() {
    // Ініціалізація двовимірного вектора
    vector<vector<int>> a = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
    
    cout << "Двовимірний масив:" << endl;
    
    // Цикл по рядкам вектора
    for (int i = 0; i < a.size(); i++) {
        // Цикл по елементам рядка
        for (int j = 0; j < a[i].size(); j++) {
            cout << a[i][j] << " ";  // Виведення елементів i-того рядка
        }
        cout << endl;  // Перехід на новий рядок
    }
    
    return 0;
}

Приклад 3.

Програма (заповнення випадковими числами) 1 спосіб

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

// Оголошення функцій
void fillRandom(vector<vector<int>>& vec, int m, int n, int a, int b);
void Printmass(vector<vector<int>>& vec);

// Головна функція
int main() {
    int m, n, first_value, last_value;
    setlocale(0, "UKR");  // Змінено на українську локаль
    cout << "Введіть діапазон значень масиву:" << endl;
    cin >> first_value >> last_value;
    srand(time(0));  // Виправлено grand на srand
    cout << "Введіть розмір матриці:" << endl;
    cin >> m >> n;
    
    // Створення вектора векторів
    vector<vector<int>> vec;

    // Виклик функції fillRandom
    fillRandom(vec, m, n, first_value, last_value);
    
    // Виклик функції Printmass
    Printmass(vec);

    return 0;
}

// Функція, що заповнює вектор векторів випадковими числами
// Параметри: vec - посилання на вектор векторів, m - кількість рядків, n - кількість стовпців,
// a - нижня межа діапазону, b - верхня межа діапазону
void fillRandom(vector<vector<int>>& vec, int m, int n, int a, int b) {
    // Ініціалізація генератора випадкових чисел
    srand(time(NULL));
    // Зміна розміру вектора векторів
    vec.resize(m);
    // Цикл по рядкам вектора векторів
    for (int i = 0; i < m; i++) {
        // Зміна розміру внутрішнього вектора
        vec[i].resize(n);
        // Цикл по стовпцям внутрішнього вектора
        for (int j = 0; j < n; j++) {
            // Генерація випадкового числа у заданому діапазоні
            vec[i][j] = a + rand() % (b - a + 1);
        }
    }
}

// Функція для виведення масиву
void Printmass(vector<vector<int>>& vec) {
    cout << "Друк масиву:" << endl;
    // Цикл по рядкам вектора векторів
    for (int i = 0; i < vec.size(); i++) {
        // Цикл по стовпцям внутрішнього вектора
        for (int j = 0; j < vec[i].size(); j++) {
            // Виведення елементу вектора
            cout << vec[i][j] << " ";
        }
        // Перехід на новий рядок
        cout << endl;
    }
}

Результат:

Приклад 4.

Програма (заповнення випадковими числами) 2 спосіб

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

void RandMatrix(int, int, int, vector<vector<int>>& matrix);
void printVector(vector<vector<int>> const &matrix);

int main() {
    int n, m, x, y;
    cout << "Введіть розмірність матриці: ";
    cin >> n;
    cout << "Введіть діапазон значень: ";
    cin >> x >> y;
    
    // значення за замовчуванням для заповнення елементів вектора
    int default_value = 1;
    // ініціалізуємо вектор цілих чисел заданим значенням за замовчуванням
    vector<int> v(n, default_value);
    // Використовуємо вектор для ініціалізації двовимірного вектора
    vector<vector<int>> matrix(n, v);  // Виправлено m на n
    
    RandMatrix(x, y, n, matrix);
    // Виводимо двовимірний вектор
    printVector(matrix);
    
    return 0;
}

// Функція для генерації випадкової матриці
void RandMatrix(int a, int b, int n, vector<vector<int>> &matrix) {
    random_device random_device;
    mt19937 generator(random_device());
    uniform_int_distribution<> distribution(a, b);
    
    for (int i = 0; i < n; i++) {
        // Створення вектора цілих чисел з випадковими значеннями
        vector<int> v;
        for (int j = 0; j < n; j++) {
            v.push_back(distribution(generator));
        }
        matrix.push_back(v);
    }
}

// Функція для виведення матриці
void printVector(vector<vector<int>> const &matrix) {
    for (vector<int> row: matrix) {
        for (int val: row) {
            cout << val << " ";
        }
        cout << endl;
    }
}

Результат:

Приклад на C++ з використанням STL (vector>) для збереження матриць і функції їх множення.

Постановка задачі

Що робить програма

  1. Зчитує дві матриці A (розмір m x n) і B (розмір n x p).
  2. Перевіряє, чи їх можна перемножити.
  3. Обчислює матрицю C = A ? B.
  4. Виводить результат.
#include <iostream>
#include <vector>

using namespace std;

// Функція для множення двох матриць
vector<vector<int>> multiplyMatrices(const vector<vector<int>>& A, const vector<vector<int>>& B) {
    // Кількість рядків і стовпців у A і B
    int m = A.size();    // рядки A
    int n = A[0].size(); // стовпці A
    int p = B[0].size(); // стовпці B

    // Результат: матриця C розміром m x p, заповнена нулями
    vector<vector<int>> C(m, vector<int>(p, 0));

    // Перемноження матриць
    for (int i = 0; i < m; ++i) {     // по рядках A
        for (int j = 0; j < p; ++j) { // по стовпцях B
            for (int k = 0; k < n; ++k) { // по спільному виміру
                C[i][j] += A[i][k] * B[k][j];
            }
        }
    }
    return C;
}

// Допоміжна функція для друку матриці
void printMatrix(const vector<vector<int>>& M) {
    for (const auto& row : M) {
        for (int val : row) { 
            cout << val << " ";
        }
        cout << endl;
    }
}

int main() {
    // Задаємо приклад двох матриць. А розміром 2x3
    vector<vector<int>> A = {
        {1, 2, 3},
        {4, 5, 6}
    };
    // В розміром 3x2
    vector<vector<int>> B = {
        {7, 8},
        {9, 10},
        {11, 12}
    };
    
    // Перевірка розмірності для множення
    if (A[0].size() != B.size()) {
        cout << "Помилка: неможливо перемножити ці матриці (невідповідність розмірів)." << endl;
        return 1;
    }
    
    // Виклик функції для множення
    vector<vector<int>> C = multiplyMatrices(A, B);
    
    // Виведення результату
    cout << "Матриця A:" << endl; printMatrix(A);
    cout << "Матриця B:" << endl; printMatrix(B);
    cout << "A * B = C:" << endl; printMatrix(C);
    
    return 0;
}

// Допоміжна функція для друку матриці
void printMatrix(const vector<vector<int>>& M) {
    for (const auto& row : M) {
        for (int val : row) { 
            cout << val << " ";
        }
        cout << endl;
    }
}

int main() {
    // Задаємо приклад двох матриць. А розміром 2x3
    vector<vector<int>> A = {
        {1, 2, 3},
        {4, 5, 6}
    };
    // В розміром 3x2
    vector<vector<int>> B = {
        {7, 8},
        {9, 10},
        {11, 12}
    };
    
    // Перевірка розмірності для множення
    if (A[0].size() != B.size()) {
        cout << "Помилка: неможливо перемножити ці матриці (невідповідність розмірів)." << endl;
        return 1;
    }
    
    // Виклик функції для множення
    vector<vector<int>> C = multiplyMatrices(A, B);
    
    // Виведення результату
    cout << "Матриця A:" << endl; printMatrix(A);
    cout << "Матриця B:" << endl; printMatrix(B);
    cout << "A * B = C:" << endl; printMatrix(C);
    
    return 0;
}

Результат:

  1. vector<vector<int>>
    — це вектор векторів, зручний для роботи з матрицями.
  2. Ініціалізація:
    vector<vector<int>> A = {
       {1, 2, 3},
       {4, 5, 6}
    };

    — означає матрицю 2*3.

  3. Функція multiplyMatrices виконує класичне трійне вкладене множення.

    Зовнішній цикл — по рядках A.

    Середній цикл — по стовпцях B.

    Внутрішній цикл — по спільному індексу (для скалярного добутку рядка і стовпця).

  4. Результат повертається як новий vector<vector<int>>.

Назад Зміст Вперед