首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >指向指向向量的指针的指针

指向指向向量的指针的指针
EN

Stack Overflow用户
提问于 2012-06-09 17:03:39
回答 1查看 1.5K关注 0票数 0

我做错什么了?

代码语言:javascript
复制
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);
}

...

密码

代码语言:javascript
复制
vector<int> *myVector2 = new vector<int>(500000000);
for(size_t i = 0; i < myVector->size(); i++) {
    myVector->at(i) = i;
}
delete myVector;

效果很好。我需要处理一个非常大的矩阵--太大了以至于不可能保存整个矩阵,我需要动态地更改内存使用情况(有时只存储一些行,但不是所有行都满了(我只需要看到它们的前k个元素)等等。

EN

回答 1

Stack Overflow用户

发布于 2012-06-09 17:15:11

new在这方面可能没有任何帮助。vector的主要目的是为您调用new

代码语言:javascript
复制
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使向量变小时,它的内存通常不会被释放。你需要用一个技巧:

代码语言:javascript
复制
std::vector< unsigned int >( new_row_length ).swap( v );

注意,只有当向量变得小得多时,这才有帮助;当使向量变大或变化很小时,最好坚持使用resize

最好的解决办法可能是找到一个现有的线性代数库,并使用一个现有的三角矩阵类。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10962865

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档