C ++ вектор вне диапазона исключений - PullRequest
0 голосов
/ 29 июня 2018

Я пишу программу, которая делает вычисления на основе команд, но у меня небольшие проблемы с диапазоном вектора.

По сути, я ввожу целые числа в вектор, последовательность целых чисел, каждое на новой строке, и, например, если я ввожу команду "sum", он получает последние два элемента вектора (последовательность целых чисел), суммирует их , удаляет их из последовательности и добавляет к последовательности новый номер.

Пример:

1 2 4 5 сумма end (эта команда завершает мою программу)

Выход: 1 2 9

Вот код:

#include "stdafx.h"
#include <iostream>
#include <string>
#include <sstream>
#include <vector>

#define CONSOLE_LOG(x) std::cout << x
#define COMMAND_END command[0]
#define COMMAND_SUM command[1]
#define COMMAND_SUBTRACT command[2]
#define COMMAND_CONCAT command[3]
#define COMMAND_DISCARD command[4]
#define COMMAND_DISPSEQ command[5]

std::string sum(std::string& x, std::string& y, std::vector<std::string>& vec)
{
    int xInt = atoi(x.c_str());
    int yInt = atoi(y.c_str());
    int result = xInt + yInt;

    std::ostringstream os;
    std::string strResult;
    os << result;
    strResult = os.str();

    vec.erase(vec.end() - 1);
    vec.erase(vec.end() - 1);

    return strResult;
}
/*
std::string subtract(std::string& x, std::string& y)
{

}
std::string concat(std::string& x, std::string& y)
{

}
std::string discard(std::string& x, std::string& y)
{

}
*/
void dispseq(std::vector<std::string>& vec)
{
    std::vector<std::string>::const_iterator iter;
    for (iter = vec.begin(); iter != vec.end(); iter++)
    {
        std::cout << *iter << std::endl;
    }
}

void enterSequence()
{
    std::vector<std::string> command =
    {
        "end",
        "sum",
        "subtract",
        "concat",
        "discard",
        "dispseq"
    };

    std::vector<std::string> sequence;
    std::string input;
    std::string a = sequence[sequence.size() - 1];
    std::string b = sequence[sequence.size() - 2];
    do
    {
        std::cin >> input;
        sequence.emplace_back(input);
        if (input == COMMAND_END)
        { 
            sequence.erase(sequence.end() - 1);
        }

        if (input == COMMAND_SUM)
        {
            sequence.emplace_back(sum(a, b, sequence));
        }

        dispseq(sequence);

    } while (input != COMMAND_END);
}

int main()
{
    enterSequence();

    std::cin.get(); std::cin.get();
    return 0;
}

А вот и моя проблема. Конечно, мне нужно определить последние два элемента вектора, и я делаю это с

std::string a = sequence[sequence.size() - 1];
std::string b = sequence[sequence.size() - 2];

Но это дает мне исключение и говорит, что я вне зоны досягаемости. Я предполагаю, что я не должен передавать размер вектора, которого все еще нет. Как я могу написать это тогда?

1 Ответ

0 голосов
/ 29 июня 2018

a и b инициализируются отрицательным индексом вашего вектора. Вы можете исправить это, изменив цикл do-while.

std::string a;
std::string b;
do
{
    if(sequence.size() >= 2)
    {
        b = sequence[sequence.size() - 2];
        a = sequence[sequence.size() - 1];
    }
    else if(sequence.size() >= 1)
    {
        a = sequence[sequence.size() - 1]
    }
    std::cin >> input;
    sequence.emplace_back(input);
    if (input == COMMAND_END)
    { 
        sequence.erase(sequence.end() - 1);
    }

    if (input == COMMAND_SUM)
    {
        sequence.emplace_back(sum(a, b, sequence));
    }

    dispseq(sequence);

} while (input != COMMAND_END);
...