文章目录
- vector容器的内存释放
- 释放方法
- 使用vector开辟一个二维数组
- 开辟一段已知大小的二维vector
- 使用一段已经开辟的二维vector
- 开辟一段未知大小的二维vector
vector容器的内存释放
首先对于数据量较小的vector容器,没有太多必要自己进行主动释放,小容量vector容器对程序效率没有太多影响。
对于大容量的vector,可以进行积极主动的释放,可以提升内存等效率。
释放方法
vector关于清除释放方面,有clear()、swap()、shrink_to_fit()函数。
释放vector内存有两种常见的做法:
// 方法一:clear()+shrink_to_fit()
#include<iostream>
#include<vector>
int main(){std::vector<int> vec;vec.push_back(1);vec.push_back(2);// 释放vec.clear();vec.shrink_to_fit();return 0;
}
// 方法二:swap()
int main(){std::vector<int> vec;vec.push_back(1);vec.push_back(2);// 释放std::vector<int> ().swap(vec);return 0;
}
为什么单独的std::vector clear()方法不能够释放?
因为其方法是 Removes all elements from the vector (which are destroyed), leaving the container with a size of 0;即它会把size重置为0,但是内存仍然被占据。vector容器中两个重要的概念是size和capacity;这是两个概念,size和capacity并非一个事情。clear()清除了vector中的内容但是并没有释放内存,即容器的capacity不为0。可参考C/C++编程:正确释放vector的内存(clear(), swap(), shrink_to_fit())中的程序。
swap()函数为什么可以?
Exchanges the content of the container by the content of x, which is another vector object of the same type. Sizes may differ.
After the call to this member function, the elements in this container are those which were in x before the call, and the elements of x are those which were in this. All iterators, references and pointers remain valid for the swapped objects.
Notice that a non-member function exists with the same name, swap, overloading that algorithm with an optimization that behaves like this member function.
个人理解是std::vector<int> ()
这个过程并没有真正的分配空间,也就是说这个vector容器的capacity为0,相当于只是声明了这个变量而已,std::vector<int> ().swap(vec)
只是让vec
指向这个声明变量,所以vec
之前指向的空间就被释放掉了。
另外,有时候可能存在内存虽然在程序释放了,但是这段空间实际上还没有归还给系统的情况,故可以在释放后跟随一句malloc_trim(0)
,是程序归还空间给系统;不过对于容量比较小的容器,一般是不需要这样做的。
使用vector开辟一个二维数组
vector开辟二维数组的好处是对于小容量的数组,可以不用自己关心释放问题;其次,并不需要确切知道二维数组的大小;第三,二维中的一维数组可以是不同长度的。
开辟一段已知大小的二维vector
// 方法一:
vector<vector<int> > a;
a.resize(row, vector<int>(column));// 方法二:
vector<vector<int> > a(row, vector<int>(column)); //默认用0初始化
//vector<vector<int> > a(row, vector<int>(column,-1));//用-1初始化二维数组
// 注:如果row > a.size(),则在a.end()之前插入vector<int>(column)的row次拷贝,相当于row行column列// 方法三:
vector<vector<int> > a;
a.resize(row);
for (int i = 0; i < row; ++i)a[i].resize(column);// 方法三和常规使用new开辟数组的操作一样
int **map = new int* [map_height];
for(int i = 0; i < map_height; i++)map[i] = new int [map_width];
// 不过new出来的空间需要自己手动释放,new分配的空间使用delete释放
for (int i = 0; i < map_height; i++)delete []map[i];
delete []map;
使用一段已经开辟的二维vector
记住,如果已经开辟了这段空间,那么就不要再使用std::vector push_back()来进行操作了。因为push_back()函数是在这个vector的后面继续新增一个空间来存储push进来的内容。如果已经开辟了二维vector,请直接使用下标来访问。
// 假设row = 20, column = 20
vector<vector<int> > a(row, vector<int>(column)); //默认用0初始化
a[1][1] = 1;
a[1][2] = 2;
// 这样进行赋值或访问即可。
开辟一段未知大小的二维vector
std::vector<std::vector<int> > a;
std::vector<int> temp_line;
for (int i = 0; i < 20; i++)temp_line.push_back(i);
a.push_back(temp_line);
对未知大小的二维数组进行存储,先声明一个二维vectorstd::vector<std::vector<int> > a
;然后不断向其中push_back一维的vectorstd::vector<int> temp_line
即可。