首页 > 编程知识 正文

vector容器是干啥的(vector容器的属性)

时间:2023-05-05 09:09:12 阅读:93928 作者:4484

容器是什么,顾名思义,是放东西的地方。 c容器包含有助于特殊用途的数据结构,如数据搜索和排序。 众所周知,常用的数据结构有数组数组数组、链表list、树tree、栈stack、队列queue、散列表hash table、集合set、映射表map等。 容器是一种叫做坦率电灯胆的数据结构。 由于这些数据结构分为系列式和相关式两种,所以容器也分为系列式容器和相关式容器。

(图为从《STL源码剖析》开始)

矢量容器1 .矢量是STL提供的串行容器

排列型容器是指其中的元素都是顺序,但不一定都是秩序。 也就是说,元素的集合按线性关系排列,但未必是有序的。 c本身有串行容器array,STL提供其他串行容器。 矢量、列表、队列、堆栈、队列、优先级队列等。

2 .载体的基础是动态数组

vector的数据放置和操作方法与c的阵列非常相似,唯一的区别是空间利用的灵活性。 array是静态数组,是静态数组最大的缺点。 每次只能分配一定大小的存储区域。 插入新元素时,需要体验“查找更大的内存空间”-“将数据复制到新空间”-“放弃旧空间”这三首曲子。 另外,对array来说,这种空间任务会强加给使用它的用户,用户需要掌握数据量,并尽可能先分配

vector用户不需要自己处理空间运营问题。 vector是一个动态空间,随着新元素的插入,旧的存储空间不够了,vector内部的机制就会自行扩展空间,用坦率的电偶来创造新元素。 当然,这样的空间扩张绝大多数情况下都逃不过“三部曲”。 但是,不需要用户自己处理,vector的处理更安全且高效。 vector实现技术的关键是大小控制和重新配置时的数据移动效率。

3 .载体的迭代器

c语言数组的情况下,使用普通的指针可以对数组进行各种操作。 由于矢量与数组数组数组array保持相同的连续线性空间,因此无论元素类型如何,常规指针都可以满足作为矢量迭代器所需的所有条件。 vector所需的迭代器操作有操作器*、操作器-、操作器- -、操作器=、操作器-=等一般指针。

因此,可以满足vector对矢量迭代程序的需求。 于是,vector提供了随机访问迭代器。

4 .载体的数据结构

综上所述,vector基底是连续线性空间。 使用两个迭代器: begin和finish。 begin和finish连续线性空间中第一个元素的位置,以及超出末端的第一个位置。 这两个迭代子表示连续线性空间的使用范围,用end_of_storage迭代子对整个连续线性空间的末端进行标准化。 其中,begin和finish符合STL的“预打开后关闭”标准。

基于这三个迭代器,可以完成很多操作。 提供一致的标签、大小、容量、空容器确定、[]运算符、顶级元素值、末端元素值等。

值得注意的是,容器的大小和容量是不同的概念。 ckddg只有在容器满载时才等于容器。 在上图中,大小size是已使用的存储空间的长度,容量是已使用的未使用的存储空间的长度。 从这些实现代码中也可以看到,如下所示。

大小类型大小()常数

{

returnsize _ type (结束(-begin ) );

}

大小类型容量()常数

{

returnsize _ type (终端存储类型);

}

C/C学习交流群: 875300321

5 .矢量的内存分配策略

标准库的实现者使用了一种内存分配策略,即以最低的成本连续存储元素。 为了实现vector容器的高速内存分配,实际分配的容量会比当前所需的容量稍多。 由于vector容器保留了这些附加存储区以存储添加的新元素,因此不需要为每个新元素分配内存。 如果继续向容器中添加元素,则会占用备用空间,并且会超过容量capacity。 此时,如果添加元素,矢量的内存管理机制会将容量扩展两倍,如果容量不足,则扩展到足够的容量。 容量的扩展必须经过“重新定位、元素的移动、原始空间的解放”这样的大规模的项目。 根据《STL源码剖析》提供的矢量源代码,矢量的内存配置原则如下:

如果矢量的原始大小为0,则设置1,即元素的大小。

如果原始大小不为0,则放置原始大小的两倍。

当然,每个vector实现都可以自由选择自己的内存分配策略。 分配多少内存取决于实现方法,不同的库采用不同的分配策略。

需要注意的是,在使用矢量迭代器时,必须始终注意矢量是否已扩展。 如果通过扩展进行重新定位,则指向原始矢量的所有迭代程序都将无效。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。