vector及vector迭代器问题

本文详细介绍了C++标准库中的vector容器,包括其作为动态数组的特点、空间管理策略以及构造函数。重点讲解了vector的迭代器使用,如在插入元素时如何避免迭代器失效,并探讨了resize和reserve方法的应用。此外,还阐述了vector的增删查改操作,特别指出删除操作不会导致缩容。最后,通过示例分析了在vector中插入元素时迭代器可能导致的问题及其解决方案。
摘要由CSDN通过智能技术生成

1.1 vector介绍

1.2 vector使用

    1.2.1vector 的构造函数声明

    1.2.2 vector迭代器的使用

    1.2.3vector 的空间相关

    1.2.4 vector的增删查改

2.1 vector迭代器问题

    

1.1 vector介绍:

    1. vector是表示可变大小数组的序列容器。意思是,vecotr本质上类似一个数组,是一串连续的空间。

    2.vector也采用的连续存储空间来存储元素,可以采用下标对vector的元素进行访问,和数组一样高效。但是又不像数组,它的大小是可以动态改变的,而且它的大小会被容器自动处理。

    3.vector使用动态分配数组来存储它的元素。当新元素插入时候,这个数组需要被重新分配大小
为了增加存储空间。其做法是,分配一个新的数组,然后将全部元素移到这个数组。就时间而言,这是一个相对代价高的任务,因为每当一个新的元素加入到容器的时候,vector并不会每次都重新分配大小。

    4.vector分配空间策略:vector会分配一些额外的空间以适应可能的增长,这样就不用每次都要开辟空间,只有当额外的空间被占满,才会再次开辟更大的空间。 不同的库采用不同的策略权衡空间的使用和重新分配。

    5.与其它动态序列容器相比(deques, lists and forward_lists), vector在访问元素的时候更加高效,在末尾添加和删除元素相对高效。对于其它不在末尾的删除和插入操作,效率更低。比起lists和forward_lists统一的迭代器和引用更好。

1.2 vector的使用

    1.2.1vector 的构造函数声明

 1.2.2 vector迭代器的使用

如下图

 1.2.3vector 的空间相关

size()计算的是有效数据个数,capacity()是计算ve开辟的空间大小,不断增添数据,size()就慢慢增大知道size()==capacity(),就会进行增容,vector的增容为两倍;

 resize\resver的使用

 

通过ve.size()改变ve的有效数据个数,ve.reserve()改变空间大小;

 也可以使用ve.size()来增容,并且初始化新增的空间;原本有效数据为5,现在增加到10,新增的被初始化为2.

 1.2.4 vector的增删查改

删除操作,不会导致缩容,对于系统而言,时间优先于空间,如果要缩容,必然会进行开辟空间,复制数据,交换地址等操作,这些操作会浪费时间,所以即使开辟的空间被删除到只剩一个数据,capacity依然不会变。

在第一个迭代器位置放两个2。

在第三个迭代器位置放一个3。

 用ve.empty()判断是否ve为空,空则返回0,不为空返回1。

 

 2.1 vector迭代器问题

举例,在v中偶数数据前放一个110,但结果却是错误,原因就在于迭代器出现了问题。

 当迭代器到2的位置时,要插入110,所以将后面的数据都后移了一位,插入数据后,pos++正好又来到2的位置,这时it迭代器失效,它的地址不在第一个迭代器和最后一个迭代器之间。

 解决方案是,每次插入迭代器都有++一下;

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值