我正在使用一个函数用随机模板值填充向量(使用双精度测试):
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;
}
}
该函数主要在向量上调用:
vector<double> listA;
setList(listA);
无论“ howMany”的值是多少,当我到达下标howMany-2时,我都得到下标超出范围的错误。
单步调试器,我的索引在下标范围内。
例如,如果用户输入10作为howMany,则在循环尝试输入时
theList[8] = randValue;
引发错误。
有任何想法吗?
最佳答案
我已经在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);
}
我的输出是:
顺便说一句,我注意到,如果您定义一个整数向量,则向量的内容始终是最小值。这是因为您需要将中间值转换为双精度值,最后将结果转换为类型T。(在整数类型中,“ /”运算符被解释为整数除法)。
你可以做到这一点。
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;
}
关于c++ - vector 下标超出范围(但不是真的),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23261069/