beëindigen aangeroepen na het gooien van een instantie van ‘std::out_of_range’

Waarom gebeurt dit, mijn programma zegt dat het geen fouten bevat, maar als ik het uitvoer, krijg ik de aanroep ‘beëindigen’ na het gooien van een instantie van ‘std::out_of_range’ what(): vector:_M_range_check. Ik ben nieuw in c++, dus ik begrijp deze fouten niet

#include <vector>
#include <iostream>
#include <random>
#include <time.h>
using namespace std;
using std::vector;
int main()
{
vector<int> deck;
vector<int> nums;
default_random_engine eng(time(0));
uniform_int_distribution<int> dis(0, 51);
int pos1;
int pos2;
int num1;
int num2;
int i;
int n;
int m;
for (i = 0; i < 52; i++)
{
    nums.push_back(i);
}
for(int j = 0; j < 52; j++)
{
    cout << nums.at(i) << "\n";
}
for(n = 0; n < 50; n++)
{
    pos1 = dis(eng);
    pos2 = dis(eng);
    cout << pos1 << "\n" << pos2 << "\n";
    num1 = deck.at(pos1);
    num2 = deck.at(pos2);
}
}

Antwoord 1, autoriteit 100%

Het lijkt mij dat dit te wijten is aan een typefout, en je zou de variabele ‘j’ in de tweede lus moeten gebruiken.
Na de eerste lus,

for (i = 0; i < 52; i++)
{
    nums.push_back(i);
}

de variabele ‘i’ bevat de waarde 52, dus het klinkt verwacht dat het aanroepen van nums.at(i) een std::out_of_range zou opleveren, aangezien nums slechts 52 waarden bevat, beginnend bij index 0.

for(int j = 0; j < 52; j++)
{
    cout << nums.at(i) << "\n";
}

Repareer het door het argument van at() te vervangen door ‘j’, waarvan ik aanneem dat dit de oorspronkelijke bedoeling was:

for(int j = 0; j < 52; j++)
{
    cout << nums.at(j) << "\n";
}

Antwoord 2, autoriteit 24%

Je krijgt hier toegang tot elementen in deck:

num1 = deck.at(pos1);
num2 = deck.at(pos2);

maar het is leeg. Je moet het op een gegeven moment vullen voordat je die oproepen doet. Je kunt controleren of een vector leeg is met de std::vector::empty methode, en de grootte bepalen met std::vector::size. Zie deze std::vector referentie voor meer informatie op die twee methoden.

LEAVE A REPLY

Please enter your comment!
Please enter your name here

14 + six =

Other episodes