安徽专业网站建设检修服务信誉好的外贸管理软件
2026/3/27 3:50:28 网站建设 项目流程
安徽专业网站建设检修,服务信誉好的外贸管理软件,在线转格式网站怎么做,目前免费的h5制作软件提示#xff1a;文章写完后#xff0c;目录可以自动生成#xff0c;如何生成可参考右边的帮助文档 文章目录一、核心比喻#xff08;快速理解#xff09;二、正式定义与特点1. size#xff08;大小#xff09;2. capacity#xff08;容量#xff09;三、实例演示…提示文章写完后目录可以自动生成如何生成可参考右边的帮助文档文章目录一、核心比喻快速理解二、正式定义与特点1. size大小2. capacity容量三、实例演示直观看到变化四、关键机制vector的扩容原理五、易混淆的resize和reserve结合size/capacity六、总结关键点在C的vector中size大小和capacity容量是两个核心概念对应vector底层动态数组的元素数量和内存空间上限理解它们的区别和联系是高效使用vector的关键。下面用通俗比喻定义实例内存机制的方式详细讲解。一、核心比喻快速理解把vector想象成一个装小球的纸箱size纸箱里实际装的小球数量能直接数到的小球个数。capacity纸箱最大能容纳的小球数量不换更大的纸箱时最多能装这么多。当小球数量size超过纸箱容量capacity时你需要换一个更大的纸箱扩容把原来的小球全部搬过去这个过程会消耗额外的时间和资源。二、正式定义与特点1. size大小定义vector中实际存储的元素个数。获取方式调用vector的成员函数size()。合法访问范围可以通过下标[0, size()-1]访问元素超出这个范围是未定义行为除非用at()会抛异常。影响size的操作所有会增加/删除元素的操作都会改变size比如构造函数vectorint arr(5)size5。push_back()尾部加元素size1、pop_back()尾部删元素size-1。resize(n)直接设置size为n。insert()插入元素size增加、erase()删除元素size减少。2. capacity容量定义vector当前分配的连续内存空间能容纳的最大元素个数无需扩容时的上限。获取方式调用vector的成员函数capacity()。核心特点capacity ≥ size永远成立因为内存至少要装下当前所有元素。影响capacity的操作只有内存重新分配的操作才会改变capacity比如reserve(n)手动预留容量若n原capacity则capacity变为n否则无变化。扩容当push_back()/insert()导致size超过capacity时vector会自动分配更大的内存capacity随之增大。shrink_to_fit()C11尝试将capacity缩小到与size相等注意这是请求而非强制编译器可能忽略。注意pop_back()/erase()只会减少size不会改变capacity内存不会自动释放避免频繁的内存分配/释放。三、实例演示直观看到变化通过代码一步步看size和capacity的变化以GCC编译器扩容策略为原容量的1.5倍为例MSVC是2倍规律一致。#includevector#includeiostreamusingnamespacestd;intmain(){// 1. 空vectorsize0capacity0无元素无内存vectorintarr;cout空vectorsizearr.size()capacityarr.capacity()endl;// size0capacity0// 2. push_back第一个元素size1capacity1自动分配内存arr.push_back(1);coutpush_back(1)sizearr.size()capacityarr.capacity()endl;// size1capacity1// 3. push_back第二个元素size2capacity2扩容到21*22arr.push_back(2);coutpush_back(2)sizearr.size()capacityarr.capacity()endl;// size2capacity2// 4. push_back第三个元素size3capacity3GCC扩容到1.5倍2*1.53arr.push_back(3);coutpush_back(3)sizearr.size()capacityarr.capacity()endl;// size3capacity3// 5. reserve(10)手动预留容量size不变capacity10arr.reserve(10);coutreserve(10)sizearr.size()capacityarr.capacity()endl;// size3capacity10// 6. push_back(4)size4capacity仍为10容量足够无需扩容arr.push_back(4);coutpush_back(4)sizearr.size()capacityarr.capacity()endl;// size4capacity10// 7. pop_back()size3capacity仍为10只删元素不释放内存arr.pop_back();coutpop_back()sizearr.size()capacityarr.capacity()endl;// size3capacity10// 8. resize(5)size5补充2个默认值0capacity仍为10arr.resize(5);coutresize(5)sizearr.size()capacityarr.capacity()endl;// size5capacity10// 9. shrink_to_fit()尝试将capacity缩小到size5arr.shrink_to_fit();coutshrink_to_fit()sizearr.size()capacityarr.capacity()endl;// size5capacity5return0;}输出结果GCC空vectorsize0capacity0 push_back(1)size1capacity1 push_back(2)size2capacity2 push_back(3)size3capacity3 reserve(10)size3capacity10 push_back(4)size4capacity10 pop_back()size3capacity10 resize(5)size5capacity10 shrink_to_fit()size5capacity5四、关键机制vector的扩容原理vector底层是连续的内存空间和数组一样这意味着它的内存地址是连续的无法在原内存后直接追加空间可能被其他数据占用。因此当size超过capacity时vector会自动扩容步骤1分配一块更大的连续内存扩容策略GCC是1.5倍MSVC是2倍目的是减少扩容次数。步骤2将原内存中的所有元素拷贝/移动到新内存。步骤3释放原内存。扩容的性能开销拷贝元素内存分配/释放因此如果提前知道元素数量用reserve(n)预留容量可以避免频繁扩容提升性能。五、易混淆的resize和reserve结合size/capacity这两个函数是操作size和capacity的核心很多人容易搞混这里总结对比函数作用对象对size的影响对capacity的影响resize(n)size直接设置size为n若n原capacity则capacity扩容到≥n否则不变reserve(n)capacity无影响size保持不变若n原capacity则capacity变为n否则不变举例说明vectorint arr; arr.resize(5);size5capacity≥5可直接下标赋值arr[0]1。vectorint arr; arr.reserve(5);size0capacity5不能下标赋值arr[0]1因为size0元素不存在。六、总结关键点size是实际元素个数capacity是内存能容纳的最大元素个数且capacity ≥ size。改变元素数量的操作如push_back、resize影响size只有内存重新分配时如reserve、扩容才影响capacity。扩容会带来性能开销因此已知元素数量时优先用reserve(n)预留容量或直接用构造函数/resize设置size。pop_back/erase不会释放内存capacity不变若要释放多余内存可使用shrink_to_fit()C11。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询