我做错什么了?
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个元素)等等。
发布于 2012-06-09 17:15:11
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。
最好的解决办法可能是找到一个现有的线性代数库,并使用一个现有的三角矩阵类。
https://stackoverflow.com/questions/10962865
复制相似问题