Я пишу программу, которая делает вычисления на основе команд, но у меня небольшие проблемы с диапазоном вектора.
По сути, я ввожу целые числа в вектор, последовательность целых чисел, каждое на новой строке, и, например, если я ввожу команду "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];
Но это дает мне исключение и говорит, что я вне зоны досягаемости. Я предполагаю, что я не должен передавать размер вектора, которого все еще нет.
Как я могу написать это тогда?