【发布时间】: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输入值> 10,您的第一个for循环会出现缓冲区溢出。为什么不使用std::vector<int>和std::vector<std::string>而不是int[10]和string[10]?或者更好,因为您总是将c和vitamins一起使用,因此请使用单个std::vector<struct>,其中struct将int和std::string一起使用。
标签: c++ vector runtime-error