【问题标题】:Adding and removing large amounts of data with std::vector [duplicate]使用 std::vector 添加和删除大量数据 [重复]
【发布时间】:2011-07-30 11:27:28
【问题描述】:

可能重复:
How to downsize std::vector?

似乎std::vector 不会释放内存,即使我调用pop_back()clear()resize()

有什么好的方法可以解决这个问题吗?例如,在以下代码中:

#include<vector>
  
using namespace std;
  
int main(){
  int i, j;
  vector<int> v[10000];
  for( i=0 ; i<10000 ; i++ ){
    for( j=0 ; j<100000000 ; j++ ){
      v[i].push_back(j);
    }
    while(v[i].size()>0){
      v[i].pop_back();
    }
    v[i].resize(1);
  }
  return 0;
}

向量在完成之前不会释放任何内存。

【问题讨论】:

  • 值得注意的是,在C++0x中,你可以做到v.shrink_to_fit()
  • 抱歉重复的问题。

标签: c++ memory stl vector


【解决方案1】:

std::vector 增长但从不缩小。原因是增长是昂贵的,所以如果你缩小然后再增长,那就是对性能的浪费。

如果你真的想缩小一个大向量,请使用交换习语:

std::vector<T> vec;
// push push push ...
std::vector<T>(vec).swap(vec);

这并不能保证vec 的新大小正好是其元素大小的总和,但应该是接近的。此外,C++0x 的 std::vector 将有一个 shrink_to_fit() 成员,可以大致做到这一点。

【讨论】:

  • std::vector&lt;T&gt;(vec) 是一个临时的,不能绑定到swap() 的参数,一个非常量引用。反转它:std::vector&lt;T&gt;(vec).swap(vec).
  • 啊,是的,请注意,我只是在这样做。 :p
猜你喜欢
  • 2020-12-26
  • 2019-07-11
  • 1970-01-01
  • 2016-08-07
  • 1970-01-01
  • 1970-01-01
  • 2011-07-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多