2017-02-04 75 views
2

我正在尝试创建一个二维向量来表示作业分配的方形矩阵。虽然程序编译成功,但当我尝试运行它时,程序崩溃并且没有输出被返回。尝试创建和访问二维向量时程序崩溃

有人可以向我解释我的错误吗?

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

您能否将您收到的错误添加到您的问题中? –

回答

0

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

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

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. 

当然,那里有迭代器和所有应该更安全的东西,但你可以稍后再看。

2

变量声明后添加打印语句如下,运行程序。你也许可以自己找到答案。

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

运行您的代码和提问者代码在cpp.sh中产生相同的结果! –

+0

@ m.r226嗯,我想你错过了该程序制作的结果。运行程序并在崩溃之前查看结果。请记住,这是家庭作业问题,我们可能想尝试OP来思考和学习。编程可以通过阅读书籍和文章来学习,但大部分通过一系列实验(例如,试验和错误)来学习。 –

0

为了填充std :: vector中的值,我更喜欢使用push_back函数而不是operator []。 push_back将向量的大小增加1,并且如果需要的话还会执行内存实时动作。记住这个解决方案是很好的,只有重新分配内存不是问题。在push_back之前预留内存总是更可取。

相关问题