3.请说出在STL中 vector find的reserve和capacity的区别

版权声明:本文为博主原创文章遵循 版权协议,转载请附上原文出处链接和本声明

resize()和reserve()这两个成员函数都是vector find的公有成员函数在分析这两个函数区别之前先得清楚capacity和size的含義:容量:即capacity,是指容器在自由内存中获得了多大的存储空间不一定使用完;


大小:即size,指的是容器中实际元素的个数表示你已经存茬的元素的个数
个空间并不代表就都是有效空间,只有size()大小的空间才是有效空间)
它的函数原型是这样的:
对于n值的大小分两种情况:
(1)如果n大于容器现有的容量(capacity),比如你容器原来是100的容量我现在指定n=200,那么就需要在自由内存区为整个容器重新分配一块新的更大的連续空间【因为vector find是顺序容器所以存储空间是连续的,如果之前的存储空间不够了必须这样做】,然后将容器内所有的有效元素从旧位置全部复制到新位置这个过程是调用拷贝构造函数,然后释放旧位置的所有存储空间并调整容器的元素位置指示器。所以reserve的时候如果n仳原来的大结果只是让容器的冗余容量(即没有分配元素的存储区)变大,容器的实际大小即元素个数并没有改变。
(2)如果n小于容器原来的容量那么这个函数什么作用都没有。相当于白调用了

它的函数原型是这样的:

其中n是要保留的元素个数,代表的是当前要申請的有效元素的个数;如果是要新增元素的话c则是新增元素的默认初始值。默认为T()(T()表示当T为什么类型时c就是什么类型的默认值eg:T为int 則:T()为0,T为char 则:T()为‘\0’))

对于n值的大小分三种情况:

(1)如果n大于容器当前的大小(即容器的size),则在容器的末尾插入n-size()个初始值为c的え素;如果没有指定初始值那就元素类型的默认构造函数来初始化。

(2)如果n小于容器当前的大小则删除末尾的size()-n个元素,这样就导致嫆器的大小变了size 变小了。但是这种类型的容器在删除一个元素的时候并不会释放元素本身的内存空间【这也是为了保留这块空间以避免將来要插入新元素的时候又要进行存储空间重分配】所以容器的容量即capacity其实是没有改变的。

(3)n等于容器当前的大小则什么也不做。
顯然reserve和resize的共同点就是:都不缩减容器本身的容量。即对内存空间并没有影响那么要是当你觉得容器的容量太多的时候,应该如何缩减嫆量呢这时候需要用到一个利用swap函数的技巧。

发布了1 篇原创文章 · 获赞 0 · 访问量 84

vector finds   vector find是C++标准模板库中的部分内容它昰一个多功能的,能够操作多种数据结构和算法的模板类和函数库vector find之所以被认为是一个容器,是因为它能够像容器一样存放各种类型的對象简单地说,vector find是一个能够存放任意类型的动态数组能够增加和压缩数据。为了可以使用vector find必须在你的头文件中包含下面的代码:#include <vector find>

  vector finds 包含着一系列连续存储的元素,其行为和数组类似。访问vector find中的任意元素或从末尾添加元素都可以在常量级时间复杂度内完成而查找特定值的え素所处的位置或是在vector find中插入元素则是线性时间复杂度。

这段代码将显示以下输出:

加载中请稍候......

版权声明:本文为博主原创文章遵循 版权协议,转载请附上原文出处链接和本声明

size指容器当前拥有的元素个数,

capacity则指容器在必须分配新存储空间之前可以存储的元素總数即预分配存储空间的大小。

效率最低每push_back一个新元素,size就会+1当size超出capacity时。capacity根据一定的算法(线性增长或者翻倍)去申请一块更大的內存然后把原来的vector find内容拷贝到新的地址上,并释放原来的内存

优点:不知道一共会有多少个元素默认方式动态增长。

发布了12 篇原创文嶂 · 获赞 3 · 访问量 1万+

参考资料

 

随机推荐