Поменять массивы на std::vector

Нужно заменить в коде массивы на динамические списки, как это сделать?

#include <iostream>
#include <iomanip>
#include <stdlib.h>

typedef struct
{
    int currentAccountPayer; //Плательщик текущего счета
    int currentAccountRecipient; //Получатель текущего счета
    int sendAmount; //Сумма перевода
} ORDER;

using namespace std;

int main()
{ setlocale(LC_ALL, "Russian");

    const int ORDER_COUNT=3; // Количество записей

    ORDER array[ORDER_COUNT];
    for (int i = 0; i < ORDER_COUNT; i++) {
        cout << "Расчётный счёт плательщика номер [" << i+1 << "]: ";
        cin >> array[i].currentAccountPayer;// Массив плательщиков

        cout << "Расчётный счёт получателя номер [" << i+1 << "] : ";
        cin >> array[i].currentAccountRecipient;// Массив получателей

        cout << "Перевод на сумму: ";
        cin >> array[i].sendAmount;// Массив переводов
    }

    // Массив сортировки
    int min;
    for (int i = 0; i < ORDER_COUNT - 1; i++) {
        min = i;

        for (int j = i + 1; j < ORDER_COUNT; j++) {
            if (array[min].currentAccountPayer > array[j].currentAccountPayer) {
                min = j;
            }
        }

        if (min != i) {
            std::swap(array[min], array[i]);// Сортировка записей
        }
    }

    // Вывод на экран
    cout << endl;
    cout << "  Расчётный счёт плательщика \t|  Расчётный счёт получателя \t|  Сумма перевода" << endl;
    cout << "  _______________________________________________________________________________" << endl;
    for (int i = 0; i < ORDER_COUNT; i++) {
        cout << "  " << array[i].currentAccountPayer << " \t\t\t|  " << array[i].currentAccountRecipient << " \t\t\t|  " << array[i].sendAmount << endl;
    }
    cout << endl;
    // Поиск плательщика

    cout << "Вывод информации о переведённых средствах:" << endl << endl;
    while (true) {
        cout << "Введите счет плательщика (OR q TO EXIT): ";

        char input_payer[20];
        cin >> input_payer;

        if (input_payer[0] == 'q' && input_payer[1] == '\0') {
            return 0;
        }

        // Обработка исключительной ситуации
        int is_valid = 1;
        for (int i = 0; i < 20; i++) {
            if (input_payer[i] == '\0') {
                break;
            }
            if (!isdigit(input_payer[i])) {
                cout << "Расчётный счёт плательщика " << input_payer << " не найден!" << endl;
                is_valid = 0;
                break;
            }
        }
        if (is_valid == 0) {
            continue;
        }

        // Поиск плательщика
        int is_found = 0;
        for (int i = 0; i < ORDER_COUNT; i++) {
            if (atoi(input_payer) == array[i].currentAccountPayer) {
                is_found = 1;
                cout << "Плательщик " << input_payer << " перевёл " << array[i].sendAmount << " rub." << endl;
                break;
            }
        }
        if (is_found == 0) {
            cout << "Расчётный счёт плательщика " << input_payer << " не найден!" << endl;
        }
    }
    return 0;
}

Ответы (1 шт):

Автор решения: V-Mor

Когда постановка задачи стала ясна, ясно стало и решение. Чтобы заменить массив на std::vector, следует в Вашем коде конструкции вида:

ORDER array[ORDER_COUNT];

заменить на

std::vector<ORDER> array(ORDER_COUNT);

Или, если в общем виде, нужно заменить везде конструкции вида:

тип название_переменной[количество_значений];

на

std::vector<тип> название_переменной(количество_значений);

Обращение к определённым элементам по индексу останется прежним.

Ну и, конечно, не забудьте добавить #include <vector> в начале программы.

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

→ Ссылка