我使用函数用随机模板填充矢量(使用双精度测试)值:
template <typename T>
void setList(vector<T> & theList)
{
srand(time(NULL));
int howMany, max, min;
cout << "How many items should be generated in the list? ";
cin >> howMany;
cin.ignore();
cout << "Max value of list? ";
cin >> max;
cin.ignore();
cout << "Min value of list? ";
cin >> min;
cin.ignore();
theList.resize(howMany);
T randValue;
for (int i = 0; i < howMany; ++i)
{
randValue = (((double) rand() / (double) RAND_MAX) * (max - min)) + min;
theList[i] = randValue;
}
}
该函数在向量中的main中调用:
vector<double> listA;
setList(listA);
无论什么价值&#34; howMany&#34;是,当我到达下标howMany-2时,我得到一个超出范围错误的下标。
单步执行调试器,我的索引在下标范围内。
例如,如果用户为howMany输入10,则循环尝试输入
theList[8] = randValue;
抛出错误。
有什么想法吗?
答案 0 :(得分:0)
我在Solaris环境中尝试过这段代码,但我没有超出范围索引的异常。
这是我的代码:
template <typename T>
void setList(std::vector<T> & list)
{
srand(time(NULL));
int howMany, max, min;
std::cout << "How many items should be generated in the list? ";
std::cin >> howMany;
std::cin.ignore();
std::cout << "Max value of list? ";
std::cin >> max;
std::cin.ignore();
std::cout << "Min value of list? ";
std::cin >> min;
std::cin.ignore();
list.resize(howMany);
T randValue;
for (int i = 0; i < howMany; ++i)
{
randValue = (((T) rand() / (T) RAND_MAX) * (max - min)) + min;
list[i] = randValue;
}
// I Have added this feature for visualization purposes
for (int i = 0; i < list.size(); ++i)
{
std::cout << "list[" << i << "]=" << list[i] << std::endl;
}
}
我的main()看起来像
int main(int argc, char** argv) {
std::vector<int> lista;
lista.clear();
setList(lista);
}
我的输出是:
顺便提一下,我注意到如果你定义一个整数向量,向量的内容总是最小值。这是因为你需要将中间值转换为double并最终将结果转换为类型T.(在intege类型中,“/”运算符被解释为整数除法。)
你可以这样做。
for (int i = 0; i < howMany; ++i)
{
randValue = static_cast<T>((static_cast<double>((T) rand()) / static_cast<double>((T) RAND_MAX)) * (max - min)) + min;
list[i] = randValue;
}
答案 1 :(得分:0)
我的困境的答案由@SingerOfTheFall提供。
具体来说,在调试时获得无意义的错误(在这种情况下,实际上在范围内超出范围)需要测试不同的途径。
如果在不同的编译器中加载显示代码运行正常,则问题不一定是代码。
从头开始重新编译代码(&#34;清理&#34;)代码在这种情况下成功了。