[英]how to pass a vector of vectors into a function expecting a (raw) pointer to pointers
[英]Pointer to vector of pointers to vectors
我错了什么?
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)他们的元素)等)。
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
使向量更resize
,通常不会释放其内存。 你需要使用一个技巧:
std::vector< unsigned int >( new_row_length ).swap( v );
注意,这只有在使矢量小得多时才有用; 当它变大或变化很小时,最好坚持resize
。
最好的解决方案可能是找到现有的线性代数库并使用现有的三角矩阵类。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.