首页 > 其他分享 >vector 容器的容量(capacity)和大小(size)之间的区别

vector 容器的容量(capacity)和大小(size)之间的区别

时间:2023-07-16 20:13:29浏览次数:63  
标签:容器 capacity 容量 value vector 大小 size

vector 容器的容量(用 capacity 表示),指的是在不分配更多内存的情况下,也就是事先分配好内存大小,如果不超出容量即便有新的元素加入也不会分配内存空间;容器可以保存的最多元素个数;而 vector 容器的大小(用 size 表示),指的是它实际所包含的元素个数。对于一个 vector 对象来说,通过该模板类提供的 capacity()成员函数,可以获得当前容器的容量;通过 size()成员函数,可以获得容器当前的大小。例如:

 1 #include <iostream>
 2 #include <vector>
 3 using namespace std;
 4 int main()
 5 {
 6 std::vector<int>value{ 2,3,5,7,11,13,17,19,23,29,31,37,41,43,47 };
 7 value.reserve(20);
 8 cout << "value 容量是:" << value.capacity()<< endl;
 9 cout << "value 大小是:" << value.size()<< endl;
10 return 0;
11 }

程序输出结果为:

value 容量是:20
value 大小是:15


显然,vector 容器的大小不能超出它的容量,在大小等于容量的基础上,只要增加一个元素(必须通过push_back增加,也就是push_back,for循环(建立5个以上元素),resize()大于容量的情况下容量大于大小),整个 value 容器的存储位置发生了改变,同时 vector 会一次性申请多个存储空间(具体多少,取决于底层算法的实现)。这样做的好处是,可以很大程度上减少 vector 申请空间的次数,当后续再添加元素时,就可以节省申请空间耗费的时间。一旦 vector 容器的内存被重新分配,则和 vector 容器中元素相关的所有引用、指针以及迭代器,都可能会失效,最稳妥的方法就是重新生成。因此,对于 vector 容器而言,当增加新的元素时,有可能很快完成(即直接存在预留空间中);也有可能会慢一些(扩容之后再放新元素)。

举个例子:

 1 #include <iostream>
 2 #include <vector>
 3 using namespace std;
 4 int main()
 5 {
 6 vector<int>value{ 2,3,5,7,11,13,17,19,23,29,31,37,41,43,47 };
 7 cout << "value 容量是:" << value.capacity()<< endl;
 8 cout << "value 大小是:" << value.size()<< endl;
 9 printf("value首地址:%p\n", value.data());
10 value.push_back(53);
11 cout << "value 容量是(2):" << value.capacity()<< endl;
12 cout << "value 大小是(2):" << value.size()<< endl;
13 printf("value首地址: %p", value.data());
14 return 0;
15 }

运行结果为:

value 容量是:15
value 大小是:15
value首地址:01254D40
value 容量是(2):22
value 大小是(2):16
value首地址: 01254E80

修改vector容器的容量和大小

另外,通过前面的学习我们知道,可以调用 reserve()成员函数来增加容器(输入比原来小的容量并不会改变它的容量)的容量(但并不会改变大小)整个容器的存储位置发生了改变;而通过调用成员函数 resize()可以改变容器的大小,(增大整个容器的存储位置会发生改变,减小不会,并且减小后被原来超出的那部分不能再被访问)并且该函数也可能会导致 vector 容器容量的增加。比如说:

 1 #include <iostream>
 2 #include <vector>
 3 using namespace std;
 4 int main()
 5 {
 6     vector<int>value{ 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47 };
 7     cout << "value 容量是:" << value.capacity() << endl;
 8     cout << "value 大小是:" << value.size() << endl;
 9     cout << value.data() << endl;
10     value.reserve(20);
11     cout << value.data() << endl;
12     cout << "value 容量是(2):" << value.capacity() << endl;
13     cout << "value 大小是(2):" << value.size() << endl;
14     //将元素个数改变为 21 个,所以会增加 6 个默认初始化的元素
15     value.resize(21);
16     cout << value.data() << endl;
17     cout << "value 容量是(3):" << value.capacity() << endl;
18     cout << "value 大小是(3):" << value.size() << endl;
19     value.resize(20);
20     cout << value.data() << endl;
21     cout << "value 容量是(3):" << value.capacity() << endl;
22     cout << "value 大小是(3):" << value.size() << endl;
23     //cout << value[20] << endl;//抛出异常提示超出范围
24     return 0;
25 }
 

运行结果为:

value 容量是:15
value 大小是:15
000001E279D75380
000001E279D75630
value 容量是(2):20
value 大小是(2):15
000001E279D75130
value 容量是(3):30
value 大小是(3):21
000001E279D75130
value 容量是(3):30
value 大小是(3):20

另外注意通过 resize()成员函数减少容器的大小(多余的元素会直接被删除),不会影响容器的容量。

vector容器容量和大小的数据类型

在实际场景中,我们可能需要将容器的容量和大小保存在变量中,要知道 vector<T> 对象的容量和大小类型都是 vector<T>::size_type 类型。因此,当定义一个变量去保存这些值时,可以如下所示:

1 vector<int>::size_type cap = value.capacity();
2 vector<int>::size_type size = value.size();

size_type 类型是定义在由 vector 类模板生成的 vecotr 类中的,它表示的真实类型和操作系统有关,在 32 位架构下普遍表示的是 unsigned int 类型,而在 64 位架构下普通表示 unsigned long 类型。
当然,我们还可以使用 auto 关键字代替 vector<int>::size_type,比如:

1 auto cap = value.capacity();
2 auto size = value.size();

参考:

C++ STL vector容量(capacity)和大小(size)的区别 - oayx - 博客园 (cnblogs.com)

标签:容器,capacity,容量,value,vector,大小,size
From: https://www.cnblogs.com/Sandals-little/p/17558436.html

相关文章

  • C++ vector使用方法
    WARNING!本博文为算法笔记,恐说明错误,不建议参考本文膜拜大佬教程看不懂的教程......
  • Query2box Reasoning over Knowledge Graphs in Vector Space using Box Embeddings
    目录概符号说明Query2Box代码RenH.,HuW.andLeskovecJ.Query2box:Reasoningoverknowledgegraphsinvectorspaceusingboxembeddings.ICLR,2020.概Boxembedding用于查询判断,和我想的那个有很大差别啊.我对这方面不是很了解,只能记录个大概.符号说明......
  • C++ STL容器之vector、list
    (1)vector连续存储的容器,动态数组,在堆上分配空间底层实现:数组扩容机制:vector增加(插入)新元素时,如果未超过当时的容量,则还有剩余空间,那么直接添加到最后(插入指定位置),然后调整迭代器。如果没有剩余空间了,则会重新配置原有元素个数的两倍空间,然后将原空间元素通过复制的方式初始......
  • vector的相关操作
    插入元素:可以使用insert()函数在指定位置插入一个或多个元素。可以通过指定插入位置的迭代器和插入元素的值或范围来进行插入操作。例如:cppstd::vector<int>v={1,2,3,4,5};v.insert(v.begin()+2,10);//在第三个位置插入元素v.insert(v.begin()+3,3,7);......
  • django python manage.py migrate 后报错字段长度超了 django.db.utils.OperationalE
     现象:在models.py将CharField字段的maxlength=修改后,执行ythonmanage.pymigrate 报错django.db.utils.OperationalError:(1118 'Rowsizetoolarge.Themaximumrowsizefortheusedtabletype,notcountingBLOBs,is65535.Thisincludes storageoverhead,c......
  • 动态数组和C++ std::vector详解
    目录1.std::vector2.vector的用法    2.1vector的定义和声明    2.2成员函数        2.2.1基本函数            operator=            assign            get_allocator        2.2.2元素访问   ......
  • 浏览器全屏时 echarts.resize() 无效/滞后解决办法
    前言echarts在dom上初始化时使用 echarts. init ,这个dom是实例容器,一般是一个具有高宽的DIV元素。不能在单个容器上初始化多个ECharts实例。 echartsInstance.resize 改变图表尺寸,在容器大小发生改变时需要手动调用。echarts.resize()的核心是监听id=“myCh......
  • 4. Q_ 设置_p_的_font_size_10rem_,当用户重置或拖曳浏览器窗口时,文本大小是
    Q:设置p的font-size:10rem,当用户重置或拖曳浏览器窗口时,文本大小是否会也随着变化?A:不会。rem是以html根元素中font-size的大小为基准的相对度量单位,文本的大小不会随着窗口的大小改变而改变。......
  • PostgreSQL向量数据库pgvector之ivfflat实践
    前言ChatGPT、OpenAI和大型语言模型(LLM)应用的不断普及,将近似近邻搜索(ANN)的概念推向了前沿,并由于嵌入的使用,引发了人们对向量数据库的重新关注。嵌入是短语的数学表示,它将语义捕捉为数值的向量量,鉴于嵌入通常由一千多个维度组成--OpenAI的维度为1,536,因此必须开发新的技术。目前还没......
  • ENVI可以修改tif图像的头文件信息吗?如cellsize、top、left、bottom、right四至等信息?
    参考:https://jingyan.baidu.com/article/c843ea0b4004ae37921e4a2a.htmlEditHeaderEditAttributes MapInfo......