1、释放内存:
empty()是用来检测容器是否为空的,clear()可以清空所有元素。但是即使clear(),所占用的内存空间依然如故。如果你需要空间动态缩小,可以考虑使用deque。如果非要用vector,这里有一个办法:
在《effective STL》和其实很多C++文章中都有指明,用clear()无法保证内存回收。但是swap技法可以。具体方法如下所示:
-
vector<int> ivec;
-
ivec.push_back(1);
-
ivec.push_back(1);
-
ivec.push_back(2);
-
ivec.push_back(2);
-
vector().swap(ivec);
-
//或者
-
ivec.swap(vector());
-
vector().swap(ivec);
-
//或者如下所示 加一对大括号都可以,意思一样的:
-
{
-
std::vector tmp;
-
ivec.swap(tmp);
-
}
2、修整空间
在一个应用中,可能会需要向一个vector中插入很多记录,比如说100000条,为了避免在插入过程中移动内存,咱实现向系统预订一段足够的连续的空间,例如
vector ivec;
ivec.reserve(100000);
这个问题是解决了。
但是,如果后来这个vector不再需要存那么多的元素了,已经通过erase删除了。但是以前咱们预留的空间却无法被其他程序再度利用,这样会造成内存一定程度上的浪费。于是,我们利用目前的vector构造一个一模一样的vector,他并没有预留空间,于是以前预留的空间也被释放以作他用了:
ivec.swap(vector(ivec));
//vector(ivec).swap(ivec)
或者如下所示 加一对大括号都可以,意思一样的:
{
std::vector tmp = ivec;
ivec.swap(tmp);
}
使用这种方法的前提是vector从前存储了大量数据,比如10000000,经过各种处理后,现在只有100条,那么向清空原来数据所占有的空间,就可以通过交换函数swap(),使得vector离开其自身的作用域,从而强制释放vector所占的内存空间。
-
#include <iostream>
-
#include <vector>
-
-
using namespace std;
-
-
int main( )
-
{
-
vector<int> v1, v2;
-
v1.push_back( 1 );
-
v1.push_back( 2 );
-
v1.push_back( 3 );
-
v2.push_back( 10 );
-
v2.push_back( 20 );
-
cout << "The number of elements in v1 = " << v1.size( ) << endl;
-
cout << "The number of elements in v2 = " << v2.size( ) << endl;
-
cout << endl;
-
v1.swap( v2 );
-
cout << "The number of elements in v1 = " << v1.size( ) << endl;
-
cout << "The number of elements in v2 = " << v2.size( ) << endl;
-
return 0;
-
}
Output:
The number of elements in v1 = 3
The number of elements in v2 = 2
The number of elements in v1 = 2
The number of elements in v2 = 3
阅读(1441) | 评论(0) | 转发(0) |