指向传染媒介的指针向量

时间:2012-06-09 17:03:40

标签: c++ vector

我错了什么?

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)他们的元素)等。)。

1 个答案:

答案 0 :(得分:1)

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

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