尝试创建和访问二维向量时程序崩溃
Program crashes when trying to create and access 2-d vector
我正在尝试创建一个二维向量来表示家庭作业的方阵。虽然程序编译成功,但当我尝试 运行 它时,程序崩溃并且没有返回任何输出。
有人可以向我解释一下我的错误吗?
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main()
{
vector < vector<int> > a;
a[0][0] = 0;
a[0][1] = 1;
cout<<a[0][0]<<a[0][1];
cout<<a.size();
}
在变量声明后添加打印语句如下,运行程序。而你或许可以自己找到答案。
int main()
{
vector < vector<int> > a;
cout<<a.size();
a[0][0] = 0;
a[0][1] = 1;
cout<<a[0][0]<<a[0][1];
cout<<a.size();
}
问题是,当使用 vector 时,您必须为要存储的元素数量分配内存。 (好吧,也使用数组,但在静态创建数组时这是隐含的)你不能继续说你想在没有盒子的情况下将东西存储在盒子里。
我可以想到两种方法来为这些元素制作 space。一种是使用构造函数,如:
std::vector<int> myVector(100); // This makes room for a 100 elements
并为此目的使用函数。
std::vector<int> myVector;
myVector.reserve(100); // This makes room for a 100 elements after the declaration
所以从那里,我想你可以弄清楚下一步是什么。您只需要为所有内容制作 space。
我个人不太使用 Vector,因为从来没有人要求我这样做(不得不在学校制作我自己的动态列表并且基本上将其用作我的 "Vector" 库),但我绝对应该使用它在需要时,因为它提供了很多优势。
请注意,我知道的一件事是您正在使用不安全的方式访问向量中的数据。不安全,因为如果它恰好进行受限访问,它不会向您抛出任何异常。
std::vector<int> myVector(10);
myVector.at(0) = 0; // What I mean is that function, you can jut wrap it inside a try-catch to make it safer.
myVector[0] = 0; // Instead of this, of course.
当然,还有迭代器和所有应该更安全的东西,但你可以稍后再看。
为了在 std::vector 中填充值,我更喜欢使用 push_back 函数而不是 operator[]。 push_back 将 vector 的大小增加 1,并在需要时进行内存重新分配。请记住,只有当内存重新分配不是问题时,此解决方案才是好的。在 push_back 之前保留内存总是可取的。
我正在尝试创建一个二维向量来表示家庭作业的方阵。虽然程序编译成功,但当我尝试 运行 它时,程序崩溃并且没有返回任何输出。
有人可以向我解释一下我的错误吗?
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main()
{
vector < vector<int> > a;
a[0][0] = 0;
a[0][1] = 1;
cout<<a[0][0]<<a[0][1];
cout<<a.size();
}
在变量声明后添加打印语句如下,运行程序。而你或许可以自己找到答案。
int main()
{
vector < vector<int> > a;
cout<<a.size();
a[0][0] = 0;
a[0][1] = 1;
cout<<a[0][0]<<a[0][1];
cout<<a.size();
}
问题是,当使用 vector 时,您必须为要存储的元素数量分配内存。 (好吧,也使用数组,但在静态创建数组时这是隐含的)你不能继续说你想在没有盒子的情况下将东西存储在盒子里。
我可以想到两种方法来为这些元素制作 space。一种是使用构造函数,如:
std::vector<int> myVector(100); // This makes room for a 100 elements
并为此目的使用函数。
std::vector<int> myVector;
myVector.reserve(100); // This makes room for a 100 elements after the declaration
所以从那里,我想你可以弄清楚下一步是什么。您只需要为所有内容制作 space。
我个人不太使用 Vector,因为从来没有人要求我这样做(不得不在学校制作我自己的动态列表并且基本上将其用作我的 "Vector" 库),但我绝对应该使用它在需要时,因为它提供了很多优势。
请注意,我知道的一件事是您正在使用不安全的方式访问向量中的数据。不安全,因为如果它恰好进行受限访问,它不会向您抛出任何异常。
std::vector<int> myVector(10);
myVector.at(0) = 0; // What I mean is that function, you can jut wrap it inside a try-catch to make it safer.
myVector[0] = 0; // Instead of this, of course.
当然,还有迭代器和所有应该更安全的东西,但你可以稍后再看。
为了在 std::vector 中填充值,我更喜欢使用 push_back 函数而不是 operator[]。 push_back 将 vector 的大小增加 1,并在需要时进行内存重新分配。请记住,只有当内存重新分配不是问题时,此解决方案才是好的。在 push_back 之前保留内存总是可取的。