STL:vector的使用(初识迭代器&迭代器失效)

vector也是动态类型的顺序表,可以存储任意类型的元素
string是动态类型顺序表,只能存储char

  • vector< char >字符数组
    string 字符串
  • 字符串结尾有\0,而vector是一个泛型类型,不能因为字符串需要\0,而对每个类型最后都去设置一个\0
    字符串也有自己的特殊操作

vector有三个字段,

start 指向空间起始位置
finish 指向最后一个元素的下一个位置
endofstorage 指向空间的末尾

写时拷贝&深拷贝

构造

STL:vector的使用(初识迭代器&迭代器失效)_第1张图片

  • 对于第二种构造方式,元素类型是自定义类型,则该类型的构造函数必须是无参或者全缺省,去创建一个匿名对象
  • 没有该方法则报错

遍历

STL:vector的使用(初识迭代器&迭代器失效)_第2张图片

插入删除

find方法是一个全局方法
返回在这个范围内,查找到的第一个元素的迭代器,没有找到则返回last

STL:vector的使用(初识迭代器&迭代器失效)_第3张图片

对于第一种插入函数,其返回值是返回插入位置的迭代器。其余两种插入的返回值都是void

两个erase函数返回值都是迭代器

迭代器

解释迭代器:有两种
1.就是指针→解引用p获得成员;++或–;==或者!=
2.实际上是将指针重新封装形成的一种新类型

对于vector来说,它的迭代器就是typedef T* iterator

迭代器失效:

  • 迭代器本质就是指针
    →迭代器失效就是指针失效
    →指针失效的原因
    →指针指向的空间不存在成为了野指针

vector在以下情况会引起迭代器失效:

  • 扩容
    所有会引起扩容的操作push_back / reserve / resize / insert / 赋值=/assign
    扩容会释放原空间,将内容拷贝到新空间,而迭代器指向的空间被释放
  • 删除
    erase(iterator pos)删除指定位置pos上的元素,删除后pos迭代器就失效了(每删一次都会失效一次)
    设计原因:要删最后一个元素,删完后没有其它的元素往前移,
    所以该函数有返回值,会返回下一个地址
  • 交换 v1.swap(v2)
    交换前it1指向v1的起始位置,只交换了内容,没有交换指针
    交换完成后,v1使用了v2的空间,it1还指向原空间

迭代器失效后如何处理:要让迭代器重新指向

auto it=v.begin();
while (it!=v.end())
{
	it=v.earse(it);//earse有返回值,返回下一个位置,直接用it接收
	++it
}
//erase返回值:返回删除位置上下一个位置的元素,所以需对其返回值接收

vector创建二维数组

STL:vector的使用(初识迭代器&迭代器失效)_第4张图片

以上方式都是针对数组每行元素相同

memcpy浅拷贝的理解

你可能感兴趣的:(STL,c++)