1. ホーム
  2. スクリプト・コラム
  3. その他

[解決済み] 'std::out_of_range' のインスタンスを投げた後に呼び出された終了処理

2022-01-12 08:10:22

質問

コードは次のとおりです。

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

}

}

実行すると、エラーが発生します。

std::out_of_range' what(): vector:_M_range_check

解決方法は?

タイプミスが原因のように見えますが、2つ目のループで変数「j」を使用する必要があります。最初のループの後です。

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

変数 'i' には 52 という値が含まれているので、 nums.at(i) を呼び出すと std::out_of_range がスローされることが予想されます。

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

at()の引数を本来の意図と思われる'j'に置き換えて修正する。

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