2009-08-20 65 views
0

我有一個名爲Contact的類,我想構建一個指向這些對象的數據結構,如127行和20列的矩陣。 我試圖使用std :: vector類這樣向量向量,壞分區

std::vector < std::vector<Contact* > > matrix (127, std::vector < Contact* > (20)); 

然後,將具有declarated在頭

std::vector<std::vector<Contact* > > Buckets; 

我之前分配給它初始化,並宣佈矩陣以下(這一步,因爲基本上我不知道該怎麼做,在一個更加清晰一小段路):

Buckets = matrix; 

但使用的push_back功能類似

Buckets[pot].push_back(cont_temp); 

經過一段時間後產生一個錯誤(「拋出'std :: bad_alloc'的實例後終止調用」),我不知道如何解決它。

是否有任何其他更好的方式來實例化和初始化矩陣?你會建議其他解決方案,而不是使用矢量向量(boost :: multiarray ..?)嗎?

感謝 (抱歉愚蠢的問題,我是個窮學生:)

編輯:我已經找到了錯誤(只是一個轉讓出界)。如果您對這種數據結構有一般建議,我仍然在這裏...

+0

你使用調試器嗎?如果是這樣,你可以停止在拋出異常的地方,看看發生了什麼。 – sharptooth 2009-08-20 08:39:42

回答

0

矩陣中的聯繫人是否動態分配?如果是這樣,當你說:

Buckets = matrix; 

你最終有兩個指針指向同一個動態分配的對象,這隻能導致麻煩的路線。您應該使用智能指針的向量,例如Boost的共享指針。

+0

小心不要使用std :: auto_ptr,因爲它不是保存在標準容器中使用,因爲它的所有權轉移語義 – Foo42 2009-08-20 08:56:56

2

當你說「過了一段時間」,這是什麼意思? std :: bad_alloc意味着你的內存不足。你有循環吞噬內存嗎?

0

如果你只打算用已知大小的二維矩陣,你可以使用一個簡單的數組:

(Contact*) matrix[127][20]; 

當然,這種方法是行不通的,如果尺寸可確定或編譯後的變化。 在這種情況下,我建議你轉而提高庫,特別是multi_array。

請參閱here的簡短示例或there的完整文檔。

typedef boost::multi_array<Contact*, 2> ContactContainer; 
ContactContainer matrix(boost::extents[127][20]);