2016-03-18 2 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, а отладка не работает, потому что программа выходит из строя, прежде чем она сможет начать отладку (что странно, t - ошибка времени компиляции).

+1

'vector headList (100,0);' создаст вектор со 100 входами. '.push_back' добавит новые записи (поэтому к концу внешнего цикла' for' векторы будут иметь 201 элемент). Второй цикл 'for' должен быть просто' for (std :: size_t i = 0; i Cornstalks

+0

@RSahu: Он сделал ... – Cornstalks

+0

@Cornstalks, его можно обрезать дальше, но теперь это не проблема. Проблема уже определена Славой. –

ответ

3

В этом коде:

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

итератора i перебирает все элементы вектора headList. *i дает вам это значение (количество головок в этой итерации). Вы используете это как индекс для векторов totalHeads и totalHeads, которые швы ошибочны. Ваш цикл должен быть:

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

Смежные вопросы