0

我错了什么?

vector<vector<unsigned int> *> *matrix
matrix = new vector<vector<unsigned int> *>(n);
for (vector<vector<unsigned int> *>::size_type i = 0; i < n; i++) {
    matrix->at(i) = new vector<unsigned int>(i + 1);
}

...

编码

vector<int> *myVector2 = new vector<int>(500000000);
for(size_t i = 0; i < myVector->size(); i++) {
    myVector->at(i) = i;
}
delete myVector;

工作正常。我需要使用一个非常大的矩阵 - 大到无法保存整个矩阵,我需要动态更改内存使用情况(有时只存储一些行,并非所有行都已满(我只需要先查看 k它们的元素)等)。

4

1 回答 1

2

new可能在这里没有任何帮助。的主要目的vector是照顾呼叫new您。

typedef vector<vector<unsigned int> > matrix_t;
matrix_t matrix( n );
std::size_t row_index = 0;
for ( matrix_t::iterator i = matrix.begin(); i != matrix.end(); ++ i ) {
    i.resize( row_index + 1 );
    ++ row_index;
}

当您想要更改行数或长度时,请调用matrix.resize()matrix[n].resize()。这最大限度地减少了分配的数量。但最好将所有内容映射到单个平面向量,该向量与您需要的最大矩阵一样大。动态释放和重新分配事物会导致各种低效率,例如不必要的缓存未命中和 VM 分页。

编辑:当使用 缩小向量时resize,通常不会释放其内存。你需要使用一个技巧:

std::vector< unsigned int >( new_row_length ).swap( v );

请注意,这仅在使向量更小时才有帮助;变大或变化较小时,最好坚持resize

最好的解决方案可能是找到现有的线性代数库并使用现有的三角矩阵类。

于 2012-06-09T17:15:11.433 回答