Why does this happen my program says that it has no errors but then when I run it I get terminate called after throwing an instance of 'std::out_of_range' what(): vector:_M_range_check. I am new to c++ so I don't understand these errors
为什么会发生这样的事情呢?我的程序说它没有错误,但是当我运行它时,我就会在抛出一个std::out_of_range (): _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);
}
}
2 个解决方案
#1
10
It looks to me as if this is due to a typo, and you should use the variable 'j' in the second loop. After the first loop,
在我看来,这是由于输入错误,你应该在第二个循环中使用变量'j'。第一次循环后,
for (i = 0; i < 52; i++)
{
nums.push_back(i);
}
the variable 'i' contains the value 52, so it sounds expected that calling nums.at(i) would throw a std::out_of_range, since nums only contains 52 values, starting at index 0.
变量'i'包含值52,所以它听起来期望调用nums.at(i)会抛出std::out_of_range,因为nums只包含52个值,从索引0开始。
for(int j = 0; j < 52; j++)
{
cout << nums.at(i) << "\n";
}
Fix it by replacing the argument of at() with 'j', which I assume was the original intent:
用“j”替换at()的参数来修正它,我认为这是最初的意图:
for(int j = 0; j < 52; j++)
{
cout << nums.at(j) << "\n";
}
#2
3
You access elements in deck
here:
你可以在甲板*问元素:
num1 = deck.at(pos1);
num2 = deck.at(pos2);
but it is empty. You have to fill it at some point before making those calls. You can check if a vector is empty with the std::vector::empty
method, and get it's size with std::vector::size
. See this std::vector
reference for more information on those two methods.
但它是空的。在打这些电话之前,你必须先把它填满。你可以用std来检查一个向量是否为空::向量:空方法,并得到它的大小与std::向量::大小。有关这两种方法的更多信息,请参见此std::vector引用。
#1
10
It looks to me as if this is due to a typo, and you should use the variable 'j' in the second loop. After the first loop,
在我看来,这是由于输入错误,你应该在第二个循环中使用变量'j'。第一次循环后,
for (i = 0; i < 52; i++)
{
nums.push_back(i);
}
the variable 'i' contains the value 52, so it sounds expected that calling nums.at(i) would throw a std::out_of_range, since nums only contains 52 values, starting at index 0.
变量'i'包含值52,所以它听起来期望调用nums.at(i)会抛出std::out_of_range,因为nums只包含52个值,从索引0开始。
for(int j = 0; j < 52; j++)
{
cout << nums.at(i) << "\n";
}
Fix it by replacing the argument of at() with 'j', which I assume was the original intent:
用“j”替换at()的参数来修正它,我认为这是最初的意图:
for(int j = 0; j < 52; j++)
{
cout << nums.at(j) << "\n";
}
#2
3
You access elements in deck
here:
你可以在甲板*问元素:
num1 = deck.at(pos1);
num2 = deck.at(pos2);
but it is empty. You have to fill it at some point before making those calls. You can check if a vector is empty with the std::vector::empty
method, and get it's size with std::vector::size
. See this std::vector
reference for more information on those two methods.
但它是空的。在打这些电话之前,你必须先把它填满。你可以用std来检查一个向量是否为空::向量:空方法,并得到它的大小与std::向量::大小。有关这两种方法的更多信息,请参见此std::vector引用。