“迭代器不可解除”

时间:2014-11-16 03:40:12

标签: c++ iterator runtime runtime-error dereference

我很喜欢代码让我感到头疼的事。除了这一个。我只是使用常用算法填充带有随机双精度的向量。问题是,在编译之后,它给了我一个“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年,所以我的问题是,为什么它会给我这个运行时错误?我事先感谢任何帮助。

2 个答案:

答案 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)。后者只是确保向量具有足够的容量......如果它已经是空的,它将保持为空。

另外,有两条建议:

  1. 考虑使用std::generate代替循环。你正在做的是为num生成值,所以这个算法会让你的读者明白。
  2. 您选择随机数的方法是统一:

    (((double) rand() / (double) RAND_MAX) * (this->max - this->min)) + this->min;

  3. 即使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;
            }
        }
    }