2016-03-18 44 views
1
#include <iostream> 
#include <random> 
#include <fstream> 
#include <time.h> 

using namespace std; 

bool generateRandomValue() 
{ 
    static std::default_random_engine e{}; 
    static std::uniform_int_distribution<int> d{ 0, 100 }; 

    bool headsTails = (d(e) > 50) ? true : false; 

    return headsTails; 
} 

int main() 
{ 
    clock_t tStart = clock(); 
    ofstream outputFile("output.txt"); 

    int totalHeads = 0; 
    int totalTails = 0; 

    vector<int> headList(100,0); 
    vector<int> tailList(100,0); 

    for (int out = 0; out <= 100; out++) 
    { 
     char result = '\0'; 
     int heads = 0, tails = 0; 

     for (int i = 0; i < 100000; i++) 
     { 
      result = (generateRandomValue()) ? 'H' : 'T'; 

      if (result == 'H') 
      { 
       heads++; 
      } 

      else 
      { 
       tails++; 
      } 
     } 

     outputFile << "Trial " << out << ": Heads: " << heads << " Tails: " << tails << endl << endl; 
     headList.push_back(heads); 
     tailList.push_back(tails); 

    } 

    for (vector<int>::iterator i = headList.begin(); i < headList.end(); i++) 
    { 
     totalHeads += headList[*i]; 
     totalTails += tailList[*i]; 
    } 
    cout << "It took: " << (double)(clock() - tStart)/CLOCKS_PER_SEC << " seconds to calculate and execute this program.\n"; 
    outputFile << "Total number of heads: " << totalHeads << " Total number of tails: " << totalTails << endl; 

    return 0; 
} 

上面是一些代碼,我一直在試圖嘗試向量(從未在類中使用它們)。該代碼在VS2015中編譯,但程序崩潰時出現以下錯誤:「向量下標超出範圍」。迭代器上的向量下標超出範圍

我認爲這是告訴我,在我的程序中的某個點上,一個向量試圖在其邊界之外的某個位置處理。我一直無法分辨錯誤是在我的存儲向量上還是在最後一個for循環中的迭代器向量上進行的,並且調試不起作用,因爲程序在開始調試之前崩潰(奇怪它不是「那麼編譯時錯誤)。

+1

'vector headList(100,0);'將創建一個包含100個條目的向量。 '.push_back'將追加新的條目(所以在'for'循環的外部結束時,向量都會有201個元素)。第二個'for'循環應該只是一個'for(std :: size_t i = 0; i Cornstalks

+0

@RSahu:他確實...... – Cornstalks

+0

@Cornstalks,它可以進一步修剪,但現在它不是問題。 Slava已經確定了這個問題。 –

回答

3

在此代碼:

for (vector<int>::iterator i = headList.begin(); i < headList.end(); i++) 
{ 
    totalHeads += headList[*i]; 
    totalTails += tailList[*i]; 
} 

i迭代迭代headList向量的所有元素。 *i爲您提供了該值(這是該迭代中頭的數量)。您使用它作爲向量totalHeadstotalHeads的接口錯誤的索引。你的循環應該是:

for (size_t i = 0; i < headList.size(); i++) 
{ 
    totalHeads += headList[i]; 
    totalTails += tailList[i]; 
} 

注:儘管這個循環:

for (vector<int>::iterator i = headList.begin(); i < headList.end(); i++) 

作品進行隨機訪問迭代器,它更常見的是它寫在表格:

for (vector<int>::iterator i = headList.begin(); i != headList.end(); ++i) 

這樣它也可以用於前向迭代器,並且可以在不修改大量代碼的情況下更改容器類型。 ++i可以更有效,特別是對於迭代器,而不是整數類型。

+0

這當然做到了!我肯定有一種感覺,即迭代器是個問題,我只是爲了試驗載體而使用它。很高興知道還有更好的選擇,謝謝! – user3857017