【问题标题】:C++ vector out of range exceptionC++ 向量超出范围异常
【发布时间】:2018-06-28 23:06:05
【问题描述】:

我正在编写一个基于命令进行计算的程序,但是我对向量的范围有点问题。

基本上,我将整数输入一个向量,一个整数序列每个都在一个新行上,例如,如果我输入命令“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];

但它给了我一个例外,并告诉我我超出了范围。我想我不应该传递一个向量的大小,它仍然没有一个。 那我怎么写呢?

【问题讨论】:

  • 对于此类项目,您最好使用stack
  • 另外,当你初始化 a 和 b 时,你的 sequence.size() 返回 0,所以 a 不能等于 sequence[-1] 并且 b 不能等于 sequence[-2]
  • 没错,这就是我注意到的,我不能传递一个没有大小的向量的大小,那我怎么把它拉出来?
  • 将它们移动到你的 do while 循环中。然后在分配它们之前,确保向量的长度足够长以适应它们。

标签: c++ c++11 vector stl


【解决方案1】:

ab 正在初始化为向量的负索引。您可以通过修改 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);

【讨论】:

    猜你喜欢
    • 2014-03-06
    • 1970-01-01
    • 1970-01-01
    • 2013-04-22
    • 1970-01-01
    • 2021-05-20
    • 1970-01-01
    • 1970-01-01
    • 2021-05-01
    相关资源
    最近更新 更多