【问题标题】:Why does runtime error show when vector is empty?为什么向量为空时会显示运行时错误?
【发布时间】:2020-06-24 21:02:45
【问题描述】:

我有以下代码,如果向量的元素超过 0 个,我会尝试找到它的最小值,否则返回 -1。

但是,当向量为空时,我得到以下运行时错误:

向量下标超出范围。

int S = 0;
string s1 = "";
int n;
cin >> n;
int c[10];
string vitamins[10];
vector <int> mask1;
for (int i = 0;i < n;i++)
{
    cin >> c[i];
    cin >> vitamins[i];
}
for (int a = 0;a < (1 << n);a++)
{
    for (int b = 0;b < n;b++)
    {
        if (a & (1 << b))
        {
            s1 += vitamins[b];
            S += c[b];
        }
    }
    if(s1.find('A') != string::npos &&s1.find('B') != string::npos && s1.find('C') != string::npos)
    {
        mask1.push_back(S);
    }
    S = 0;
    s1 = "";
}
int minimum = mask1[0];
int size = mask1.size();
if(mask1.empty())
{
    cout<<-1<<endl;
}
else
{
    for (int m = 1;m < size;m++)
    {
        if (minimum > mask1[m])
        {
            minimum = mask1[m];
        }
    }
    cout << minimum << endl;
}

【问题讨论】:

  • 在检查向量是否为空之前,请先执行int minimum = mask1[0];
  • 抱歉上次的评论,我现在就试试这个!
  • 如果mask1 为空,则int minimum = mask1[0];undefined behaviour
  • 供以后参考,使用mask1.at(0)会抛出异常,可以处理,更容易检测。
  • 另外,仅供参考,如果用户为n 输入值&gt; 10,您的第一个for 循环会出现缓冲区溢出。为什么不使用std::vector&lt;int&gt;std::vector&lt;std::string&gt; 而不是int[10]string[10]?或者更好,因为您总是将cvitamins 一起使用,因此请使用单个std::vector&lt;struct&gt;,其中structintstd::string 一起使用。

标签: c++ vector runtime-error


【解决方案1】:

在这一行:

int minimum = mask1[0];

您访问mask1 的第一个索引之前检查它是否为空。在它为空的情况下(即大小为 0),这将导致未定义的行为。

你应该把这个声明放在之后你检查 mask1 是否为空。

【讨论】:

  • 下标超出范围是未定义的行为; “导致越界错误”具有误导性,因为人们可能认为程序以某种定义的方式做出反应,例如通过抛出异常。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-21
  • 2016-04-05
  • 2022-06-26
  • 2020-12-12
  • 1970-01-01
  • 2017-10-20
相关资源
最近更新 更多