C++ &引用;迭代器不可取消引用“;

C++ &引用;迭代器不可取消引用“;,c++,iterator,runtime,runtime-error,dereference,C++,Iterator,Runtime,Runtime Error,Dereference,我喜欢代码让我头疼的时候。除了这个。我只是使用一种常用的算法用随机双精度填充一个向量。问题是,在编译之后,它会给我一个“迭代器不可取消引用”的运行时错误。以下是我的代码路径: -首先,我创建一个类的实例 Random rm; -哪个运行这个构造函数 Random::Random() // Constructor { this->cAR(); this->min = 0; // Default: Sets minimum to zero this-&

我喜欢代码让我头疼的时候。除了这个。我只是使用一种常用的算法用随机双精度填充一个向量。问题是,在编译之后,它会给我一个“迭代器不可取消引用”的运行时错误。以下是我的代码路径:

-首先,我创建一个类的实例

 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();
}
-这是在这个函数中定义的

double Random::nextDbl()
{
    double temp = *numCount;
    return temp;
    numCount++;
    place++;
}

在我看来,这是一条正确的代码路径。现在,我只做了2年的代码编写工作,在一所实际的大学里只做了1年的学生,所以我的问题是,为什么它会给我这个运行时错误?我感谢你事先的帮助

您正在取消对
end()
迭代器的引用,该迭代器无效:

 for (counter = this->num.begin(); counter <= num.end(); counter++)

代码中有两个问题。首先:在循环中取消引用
end()
迭代器

for (counter = this->num.begin(); counter <= num.end(); counter++)
//                                        ^^ should be less than
我想你是想调用
resize(250)
而不是
reserve(250)
。后者只是确保向量有足够的容量。。。如果它已经是空的,它将保持为空

此外,有两项建议:

  • 考虑使用作为循环的替代品。您所做的正是为
    num
    生成值,因此此算法将使其对读者明确
  • 您选择随机数的方法不统一:

    (((双)rand()/(双)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;
            }
        }
    }
    
    int nextRandom(){
    int range=this->max-this->min+1;
    int max\u rand=rand\u max/range*range;//rand\u max下范围的最大倍数
    对于(;;){
    int r=rand();
    如果(r最小值;
    }
    }
    }
    
    但为什么要使用++计数器?我不是应该给第一个索引分配一个随机数,然后增加索引的位置吗?为什么计数器必须事先递增?宁愿递增前的计数器也不要递增后的计数器。可能有很多线程,所以在你最喜欢的C++书籍中,为什么会出现这种情况。仍然没有骰子。我已经更换了计数器和条件,还使用了resize而不是reserve,所以我运气不好。也许我会重做整件事,看看结果如何。@user3338383-您的代码仍然必须有提到的更改。你只是碰巧在你的程序的其他地方发生了另一个错误。哪里是调整向量大小的理想位置?它应该在构造函数中还是在fillVect()本身中?@user3338383我把它放在
    fillVect()中。那是最合理的地方。
    
    for (counter = this->num.begin(); counter <= num.end(); counter++)
    //                                        ^^ should be less than
    
    this->num.clear();       // num is now empty
    this->num.reserve(250);  // num is still empty
    
    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;
            }
        }
    }