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;
}
}
}