[C++][STL]容器的capacity、max_size以及内存分配
2014-06-12 08:09
267 查看
capacity - 容器的成员函数capacity()取得
max_size - 容器的成员函数max_size()取得
STL容器的capacity属性,表示STL在发生realloc前能允许的最大元素数,也可以理解为预分配的内存空间。例如一个vector<int> v的capacity为5,当插入第6个元素时,vector会realloc,vector内部数据会复制到另外一个内存区域。这样之前指向vector中的元素的指针、迭代器等等均会失效。
max_size属性和capacity不同,表示STL容器允许的最大元素数,通常,这个数是一个很大的常整数,可以理解为无穷大。这个数目与平台和实现相关,在我的机器上vector<int>的max_size为1073741823,而string的max_size为4294967294。因为max_size很大~所以基本不会发生元素数超过max_size的情况,只需知道两者区别即可。
deque双向队列情况比较特殊,deque将内存分块,每次分配固定大小的分块,一个分块填充满后开辟新的分块,也属于散布-连续混杂的情况,虽然deque会预分配内存空间,但也不会产生realloc(人家是alloc),所以也不具有capacity属性。
vector<T>
默认构造函数 - capacity = 0
使用构造函数vector<T>(n, value=T())指定capacity - capacity = n
string (basic_string<char> )
默认构造函数 - capacity = 15
没有指定capacity的构造式
指定了初始字符串的 - capacity = 大于字符串长度且等于n*15-1
basic_string<wchar_t>
默认构造函数 - capacity = 7
指定了初始字符串的 - capacity = 大于字符串长度且等于n*8-1
除了通过构造式设定capacity,也可以使用reserve(n)来设定容器对象的capacity,避免之后的realloc。不过这一过程是只增不减的,如果n小于当前capacity,则reserve(n)无效。
新建一个vector/string
为新建的vector/string填充原容器的内容
将原容器的变量名指向新的容器
实际使用中只需要一条语句即可。
max_size - 容器的成员函数max_size()取得
STL容器的capacity属性,表示STL在发生realloc前能允许的最大元素数,也可以理解为预分配的内存空间。例如一个vector<int> v的capacity为5,当插入第6个元素时,vector会realloc,vector内部数据会复制到另外一个内存区域。这样之前指向vector中的元素的指针、迭代器等等均会失效。
max_size属性和capacity不同,表示STL容器允许的最大元素数,通常,这个数是一个很大的常整数,可以理解为无穷大。这个数目与平台和实现相关,在我的机器上vector<int>的max_size为1073741823,而string的max_size为4294967294。因为max_size很大~所以基本不会发生元素数超过max_size的情况,只需知道两者区别即可。
设定capacity
List, Map/Multimap, Set/Multiset, Deque
并不是所有的容器都会发生realloc,List,Map/Multimap,Set/Multiset的元素在内存中散布,不预分配内存,所以不会产生realloc的情况,对于这些容器,其capacity是无意义的,所以这些容器没有capacity()成员函数,也没有capacity属性。deque双向队列情况比较特殊,deque将内存分块,每次分配固定大小的分块,一个分块填充满后开辟新的分块,也属于散布-连续混杂的情况,虽然deque会预分配内存空间,但也不会产生realloc(人家是alloc),所以也不具有capacity属性。
Vector, String, basic_string<wchar_t>
实际具有capacity属性的容器只有vector和string,在不同实现下,capacity也不尽相同。在我的机器上,情况如下:vector<T>
默认构造函数 - capacity = 0
使用构造函数vector<T>(n, value=T())指定capacity - capacity = n
string (basic_string<char> )
默认构造函数 - capacity = 15
没有指定capacity的构造式
指定了初始字符串的 - capacity = 大于字符串长度且等于n*15-1
basic_string<wchar_t>
默认构造函数 - capacity = 7
指定了初始字符串的 - capacity = 大于字符串长度且等于n*8-1
除了通过构造式设定capacity,也可以使用reserve(n)来设定容器对象的capacity,避免之后的realloc。不过这一过程是只增不减的,如果n小于当前capacity,则reserve(n)无效。
收缩容器的内存占用空间
Vector, String, basic_string<wchar_t>
对于vector和string,因为reserve()的效果是只增不减,所以无法通过reserve()来收缩空间。如需收缩内存空间,思路如下:新建一个vector/string
为新建的vector/string填充原容器的内容
将原容器的变量名指向新的容器
实际使用中只需要一条语句即可。
vector<int> v(10, 5); v.reserve(20); vector<int>(v).swap(v);
相关文章推荐
- [C++][STL]容器的capacity、max_size以及内存分配
- [C++][STL]容器的capacity、max_size以及内存分配
- 容器的capacity、max_size以及内存分配
- [置顶] 从零开始学C++之STL(二):实现简单容器模板类Vec(vector capacity 增长问题、allocator 内存分配器)
- C++ STL 不同容器的比较 以及使用时机
- C++ STL之 vector的capacity和size属性区别
- C++ STL中容器部分 有关deque(双端数组形式)的初始化 元素插入 遍历 以及distance()函数的使用 20180322day12
- C++中max_size()、size()、capacity()和reserve()函数
- C++ STL之min_element()与max_element()(取容器中的最大最小值)
- C++ STL之 vector的capacity和size属性区别
- [转贴]从零开始学C++之STL(二):实现一个简单容器模板类Vec(模仿VC6.0 中 vector 的实现、vector 的容量capacity 增长问题)
- C++9.4 vector容器的自增长(size、capacity、reserve)
- C++容器中 size(), capacity, reserve() ,resize() 函数
- C++STL选择合适的容器以及容器操作的时间复杂度
- STL中容器的几个容易混淆的成员函数-size, capacity, resize, reserve
- vector容器assign(),capacity(),size(),swap(),get_allocator(),max_size(),reserve(),resize()
- C++ 顺序容器的操作(4) 容器大小的操作size、max_size、empty、resize
- [置顶] 从零开始学C++之STL(二):实现简单容器模板类Vec(vector capacity 增长问题、allocator 内存分配器)
- C++ STL 有关容器部分 priority_queue 优先级队列的基本操作以及认识案例
- c++容器扩展---verctor的capacity()操作以及扩展