![](/img/trans.png)
[英]terminate called after throwing an instance of '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.