程序在尝试创建和访问二维矢量时崩溃

Program crashes when trying to create and access 2-d vector

本文关键字:二维 崩溃 创建 访问 程序      更新时间:2023-10-16

我正在尝试创建一个二维向量来表示家庭作业的方阵。尽管程序编译成功,但当我尝试运行它时,程序会崩溃,并且不会返回任何输出。

有人能向我解释一下我的错误吗?

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

问题是,当使用向量时,必须为要存储的元素数量分配内存。(好吧,也使用数组,但在静态创建数组时,这有点隐含)当没有盒子时,你不能说你想把东西存储在盒子里。

我可以想出两种方法来为这些元素腾出空间。一种是使用如下构造函数:

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

所以,从那里,我想你可以弄清楚接下来会发生什么。你只需要为所有东西腾出空间。

我个人不太使用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::向量中的值,我更喜欢使用push_back函数而不是运算符[]。push_back将向量的大小增加一,如果需要,还可以执行内存重新分配。请记住,只有当内存重新分配不是问题时,此解决方案才是好的。最好在push_back之前保留内存。