在抛出"std::out_of_range"实例后终止调用

terminate called after throwing an instance of 'std::out_of_range'

本文关键字:调用 实例 终止 range out std of      更新时间:2023-10-16

为什么会发生这种情况,我的程序说它没有错误,但是当我运行它时,我在抛出"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";
}

通过将 at() 的参数替换为"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参考。

相关文章: