2022-04-09 STL容器vector与拷贝构造函数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2022-04-09 STL容器vector与拷贝构造函数相关的知识,希望对你有一定的参考价值。

参考技术A 1:所有的容器都是存的副本,因此stl容器中的元素都必须能够被拷贝。

2:vector  a pushback时候其实调用了myclass的拷贝构造函数将参数b拷贝进去的,数据B在出了a的作用域后将通过析构函数自己释放自己。

3:拷贝构造函数:自己调用的,如果没有自己定义的时候,则只是简单的把对象每个成员变量的值设置为与原来的对象相等,相当于memcpy,浅拷贝问题。因此要自己定义拷贝构造函数。

4:vector可以预定一个数量 reserve,提高效率,否则按照0 1 2这样动态搬运。两倍空间搬运  这个时候不光这次新的pushback需要调用拷贝构造,之前旧的也需要在调用一次拷贝构造。

因此心得就是:容量按照两倍递增,为了提高程序的效率,最好一开始就reverse确定vector的大小,避免动态扩展。

迭代器问题:vector或者deque这种顺序容器,使用迭代器删除元素后,当前迭代器失效,因此返回的值需要接过来啊 否则在循环删除的时候会有问题。

vectordata = 1,2,3,4,5,6,7,8,9;

for(autoiter = data.begin(); iter != data.end();)



iter = data.erase(iter);



而map list这种非线性的不影响,因此可以在删除 前通过++拿到之后的迭代器 可以这样写

map<int, int> dataMp = 1,2,3,4,5,6 ;

for (auto iter = dataMp.begin(); iter != dataMp.end();)



        // 两种都可

dataMp.erase(iter++);

iter = dataMp.erase(iter);

C++STL容器归纳总结顺序容器

顺序容器:

顺序容器包括:vector、deque、list、forward_list、array以及string

vector:可变大小数组,即将元素保存在一段连续的内存空间中。支持快速随机访问。在尾部之外的位置插入删除元素可能会很慢。

PS:当元素已经占满了预先分配的内存空间,插入新的元素时,开辟一段新的内存空间,大小为之前vector的两倍,再将vector内的元素拷贝到新的内存空间内。

技术分享

vector的插入删除操作会造成迭代器的失效

 

 

list:双向链表。只支持双向顺序访问。在list任何位置进行插入、删除都很快。

注意几个函数:

splice 将1个list的一段连续数据接在另一个list的某个位置之前

merge、sort(使用的是快排)

 

 

deque:双向队列,双端开口的连续空间(逻辑上看来是这样的,但并不是vector那样的线性连续空间)。在头尾位置插入删除数据很快。

deque与vector的差异

1.deque允许常数时间内对头端进行数据的插入或删除。

2.deque没有所谓的容量观念,因为它是动态地以分段连续空间组合而成,随时可以增加一段新的空间并链接起来。

deque的实现原理:

deque实际上由一段一段的定量连续空间链接构成,一旦有必要在deque的头部或尾部增加新的空间,便配置一段定量连续空间,串接在整个deque的头端或尾端。

因此deque必须要有一个中央控制组件来维护整体连续的假象并提供随机存取的接口。

deque采用一小块连续空间称为所谓的“map”,“map”内的每一个元素都是指针,指向另一段较大的连续内存空间,被称为缓冲区,缓冲区既是deque存储空间的主体。

技术分享

 

如何维持“整体连续“的假象?

通过对deque的迭代器的operator++与operator--的重载来实现。

通过源码可以看到deque的迭代器类内有这么几个成员

T* cur;  此迭代器所指缓冲区中的现行元素

T* first; 此迭代器所指缓冲区中的头

T* last;  此迭代器所指缓冲区中的尾

map_point node; 指向“map”中对应的元素

 

 

stack

stack是以deque或list为底部结构,并将其接口改变,以符合“先进后出”的特性来实现的。严格来说不算STL容器中的一类,STL把这种称为container adapter。

PS:stack没有迭代器

queue

queue与stack同理。

 

顺序容器还有

forward_list 单向链表

string 与vector相似的容器,专门用于保存字符。

 

    

以上是关于2022-04-09 STL容器vector与拷贝构造函数的主要内容,如果未能解决你的问题,请参考以下文章

由C++ STL的vector容器中存储的对象拷贝引起的对capacity属性 的理解

用类模板实现容器存储自定义数据类型(类似于STL里面的vector)

STL之vector

容器元素增删内存变化浅析

STL容器读书笔记

C++STL容器归纳总结顺序容器