在vector里,不管是循环、还是查看容器内元素大小,我们都会用到size()这个常用函数来获取当前容器内元素个数(几乎所有容器都有这个size()函数来跟踪容器内元素大小)。有时我们也常常听到capacity(),这个函数意思是容量,对于不熟悉size()、capacity()的小伙伴经常将它两弄混,导致一些概念混淆问题。接下里我将向读者详细介绍它两直接的关系,毕竟能用一个变量维护的东西,干嘛会有两个变量呢,肯定是有区别的:
capacity,被称为容量,意思是容器能够容纳多少元素。
size,大小,意思是容器内存放多少元素。
vector里有一个函数reserve(n),意思是预存,re的意思是再一次,serve的意思是保存,该函数行为是指定容器大小。reserve(n)这个行为并不像int a[100]普通数组一样直接申请内存且初始化100个元素(这里普通数组是在栈上申请的内存),而是仅仅在堆区申请内存。
现在我们就通过reserve函数行为说明capacity()与size()直接的不同:
#include<bits/stdc++.h> /* size()和capacity()是两种完全不同的概念 */ using namespace std; void test() { vector<int> v{1,2,3,4,5}; v.reserve(10);//预存10个int空间 cout << "此时容器内元素个数是" << v.size() << '\n'; cout << "此时容器容量为" << v.capacity() << '\n'; } int main(){ test(); return 0; }
还有,设置容器容量,别用成resize(),这个resize()是控制容器元素个数的,你要是设置大于size(),它会申请内存和存放默认元素,反之则会通过尾删进行元素削减。
#include<bits/stdc++.h> /* resize()和reserve()是两种完全不同的概念 */ using namespace std; void test() { int a[100] ; vector<int> v{1,2,3,4,5}; v.resize(3); cout << "缩小容器内元素个数后,此时容器内元素个数是" << v.size() << '\n'; cout << "它们分别是"; for(int i=0;i<v.size();++i) cout << v[i] << " "; cout << '\n'; v.resize (5); cout << "扩大容器内元素个数后,此时容器内元素个数是" << v.size() << '\n'; cout << "它们分别是"; for(int i=0;i<v.size();++i) cout << v[i] << " "; cout << '\n'; } int main(){ test(); return 0; }
这里先是削减元素,通过vector默认进行尾删操作,所以我们看到了1、2、3;后是进行扩大元素个数,由于默认元素是0,差两个元素,所以按0填充,我们看到1、2、3、0、0。
总结:size()跟踪容器元素总和,resize()控制容器元素总和,reserve预留空间,通过capacity()来获取。
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程