我很喜欢代码让我感到头疼的事。除了这一个。我只是使用常用算法填充带有随机双精度的向量。问题是,在编译之后,它给了我一个“Iterator not dereferenceable”运行时错误。这是我的代码路径:
- 首先我创建一个类的实例。
Random rm;
- 哪个运行此构造函数
Random::Random() // Constructor
{
this->cAR();
this->min = 0; // Default: Sets minimum to zero
this->max = RAND_MAX; // Default: Sets maximum to RAND_MAX
fillVect(); // Fills vector
this->numCount = num.begin();
}
-cAR只是在下面的函数中设置一些值
void Random::cAR()
{
this->num.clear();
this->num.reserve(250);
this->place = 0;
}
- 对于主要问题(我认为),我通过向量迭代并用生成的随机数填充
void Random::fillVect()
{
srand(time(NULL));
vector<double>::iterator counter;
for (counter = this->num.begin(); counter <= num.end(); counter++)
{
*counter = (((double) rand() / (double) RAND_MAX) * (this->max - this->min)) + this->min;
}
shuffle();
}
- 应该用随机数填充矢量(这是一个“双”型矢量,顺便说一句)。然后,我用这个语句
调用向量中的下一个数字(应该是开头的第0个索引)double r = rm.nextDbl();
- 在此功能中定义
double Random::nextDbl()
{
double temp = *numCount;
return temp;
numCount++;
place++;
}
在我的脑海中,这是一个正确的代码路径。现在,我只编写了2年的编程,而且作为一名实际大学的学生只有1年,所以我的问题是,为什么它会给我这个运行时错误?我事先感谢任何帮助。
答案 0 :(得分:1)
您正在取消引用end()
迭代器,该迭代器无效:
for (counter = this->num.begin(); counter <= num.end(); counter++)
这应该是:
for (counter = this->num.begin(); counter != num.end(); ++counter)
答案 1 :(得分:1)
您的代码中存在两个问题。首先:您正在解除引用循环中的end()
迭代器
for (counter = this->num.begin(); counter <= num.end(); counter++)
// ^^ should be less than
第二:你的num
向量是空的,所以一旦你解决了第一个问题,你最终将没有数字:
this->num.clear(); // num is now empty
this->num.reserve(250); // num is still empty
我认为您打算拨打resize(250)
而不是reserve(250)
。后者只是确保向量具有足够的容量......如果它已经是空的,它将保持为空。
另外,有两条建议:
num
生成值,所以这个算法会让你的读者明白。 您选择随机数的方法是不统一:
(((double) rand() / (double) RAND_MAX) * (this->max - this->min)) + this->min;
即使rand()
本身产生均匀分布,也不会产生均匀分布......而且这几乎不会给你this->max
作为值。一个更好的解决方案是:
int nextRandom() {
int range = this->max - this->min + 1;
int max_rand = RAND_MAX / range * range; // largest multiple of range under RAND_MAX
for (;;) {
int r = rand();
if (r < max_rand) {
return (r % range) + this->min;
}
}
}