vector及vector迭代器问题

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 的构造函数声明

vector及vector迭代器问题_第1张图片

 1.2.2 vector迭代器的使用

如下图vector及vector迭代器问题_第2张图片

 1.2.3vector 的空间相关

vector及vector迭代器问题_第3张图片

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

vector及vector迭代器问题_第4张图片

 resize\resver的使用

vector及vector迭代器问题_第5张图片

 

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

vector及vector迭代器问题_第6张图片

 也可以使用ve.size()来增容,并且初始化新增的空间;原本有效数据为5,现在增加到10,新增的被初始化为2.vector及vector迭代器问题_第7张图片

 1.2.4 vector的增删查改

vector及vector迭代器问题_第8张图片

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

vector及vector迭代器问题_第9张图片

vector及vector迭代器问题_第10张图片在第一个迭代器位置放两个2。

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

vector及vector迭代器问题_第11张图片

 用ve.empty()判断是否ve为空,空则返回0,不为空返回1。vector及vector迭代器问题_第12张图片

 

vector及vector迭代器问题_第13张图片 2.1 vector迭代器问题

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

vector及vector迭代器问题_第14张图片

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

vector及vector迭代器问题_第15张图片

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

vector及vector迭代器问题_第16张图片

 

 

你可能感兴趣的:(c++,c#,c语言,数据结构)