2009-08-20 80 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]);