簡體   English   中英

拋出'std :: out_of_range'實例后調用終止

[英]terminate called after throwing an instance of 'std::out_of_range'

為什么這會發生我的程序說它沒有錯誤但是當我運行它時我在拋出'std :: out_of_range'的實例后調用終止調用what():vector:_M_range_check。 我是c ++的新手,所以我不明白這些錯誤

#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);

}

}

它看起來好像這是由於拼寫錯誤,你應該在第二個循環中使用變量'j'。 在第一次循環之后,

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

變量'i'包含值52,所以聽起來預計調用nums.at(i)會拋出一個std :: out_of_range,因為nums只包含52個值,從索引0開始。

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

通過將'(')的參數替換為'j'來修復它,我認為這是原始的意圖:

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

你在這里訪問deck元素:

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

但它是空的。 在撥打電話之前,你必須在某個時候填寫它。 您可以使用std::vector::empty方法檢查向量是否為空,並使用std::vector::size獲取它的std::vector::size 有關這兩種方法的更多信息,請參閱此std::vector參考

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM