2014-11-16 25 views
0

當代碼讓我頭疼的時候,我就愛上它了。除此之外。我只是用一個經常使用的算法,用隨機雙打填充矢量。問題是,編譯之後,它給了我一個「迭代器而不可引用」的運行時錯誤。這裏是我的代碼路徑:「迭代器不可解引用」

- 首先我創建一個類的實例。

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

- 應該用隨機數填充向量(這是一個「雙」型向量,btw)。然後,我打電話向量中的下一個號碼(這應該是在開始的0指數)這個說法

double r = rm.nextDbl(); 

首位,而其在該功能

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

定義。在我的頭上,這是一個正確的代碼路徑。現在,我只寫了兩年,在一所大學裏只有一年的學生,所以我的問題是,爲什麼它會給我這個運行時錯誤?我很感激任何幫助。

回答

1

您提領的end()迭代器,這是無效的:

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

這應該是:

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

但爲什麼++計數器?我不應該爲第一個索引分配一個隨機數,然後增加索引位置?爲什麼櫃檯必須事先增加? –

+0

優先於增量後的預增量。在SO和你最喜歡的C++書籍中,可能有很多線索是爲什麼會出現這種情況。 – PaulMcKenzie

+0

還沒有骰子。我已經替換了計數器和條件,並且還使用了調整大小而不是保留,所以我運氣不好。也許生病只是重做整個事情,看看結果如何。 –

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;

這不會產生均勻分佈的,即使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; 
     } 
    } 
} 
+0

哪裏會是調整矢量大小的理想場所?它應該在構造函數還是fillVect()本身? –

+0

@ user3338383我把它放在'fillVect()'中。這是最合理的地方。 – Barry