【问题标题】:Pointer to vector of pointers to vectors指向向量的指针的指针
【发布时间】:2025-12-29 08:05:06
【问题描述】:

我做错了什么?

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

【问题讨论】:

  • 存储指向vector 的指针的vector 没有多大意义。 std::vector 并不比指针大多少,通常只有大约 3 个指针大小。因此,仅存储指向 vectors 的指针不会获得太多内存
  • 另外,您遇到了什么错误?并停止将您的签名放回您的帖子中。我们可以在问题右侧的框中看到您的姓名。
  • 嗯……vectors 仍然存在,即使您存储指向它们的指针。所以实际上这是存储两者,问题(效率方面)是通过不必要的指针存储和间接。
  • 确实如此,但是如果我在第二个示例中查看内存使用情况,我确实能够通过删除向量来释放内存。我需要为向量成员做这件事。
  • 即有一次 2 * 250000000 长行,然后只有一行有 500000000 个数字。

标签: c++ vector


【解决方案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

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

【讨论】:

  • 我尝试通过一个简单的向量显示这种方式,但是如果我通过 top(在 Linux 中)显示内存使用情况,resize 命令可以提高内存使用率,但不会减少。
  • 是的,但是我的矩阵对于整个程序不会是三角形的。我还需要一些更短和更长的行(这是图论和邻接表的问题)
  • @qwertzuiop:缩短一行使用:std::vector&lt;int&gt;().swap(matrix[12]);
  • @qwertzuiop D'oh,我写的建议和 Loki 一样。但在这种情况下,最好的做法是一开始就避免编码太低级。至少寻找一个具有高级(例如矩阵乘法)操作的库,您可以从中合成算法。否则,请找到一个可以为您提供所需矩阵类型的平面表示的方法,然后分配/释放那些巨大的平面向量,而不是尝试转换较小向量的向量。
  • 感谢您的回答。我会尝试为我的目的找到一些高级别的东西。