2017-02-04 72 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之前預留內存總是更可取。

相關問題