在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;
}

vector容器内的容量和容纳元素总和截然不同

还有,设置容器容量,别用成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;
}

实操证明resize()与reserve()截然不同

这里先是削减元素,通过vector默认进行尾删操作,所以我们看到了1、2、3;后是进行扩大元素个数,由于默认元素是0,差两个元素,所以按0填充,我们看到1、2、3、0、0。

总结:size()跟踪容器元素总和,resize()控制容器元素总和,reserve预留空间,通过capacity()来获取。

点赞(0)

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

Dotcpp在线编译      (登录可减少运行等待时间)