vector也是动态类型的顺序表,可以存储任意类型的元素
string是动态类型顺序表,只能存储char
- vector< char >字符数组
string 字符串- 字符串结尾有\0,而vector是一个泛型类型,不能因为字符串需要\0,而对每个类型最后都去设置一个\0
字符串也有自己的特殊操作
vector有三个字段,
start | 指向空间起始位置 |
---|---|
finish | 指向最后一个元素的下一个位置 |
endofstorage | 指向空间的末尾 |
写时拷贝&深拷贝
构造
- 对于第二种构造方式,元素类型是自定义类型,则该类型的构造函数必须是无参或者全缺省,去创建一个匿名对象
- 没有该方法则报错
遍历
插入删除
find方法是一个全局方法
返回在这个范围内,查找到的第一个元素的迭代器,没有找到则返回last
对于第一种插入函数,其返回值是返回插入位置的迭代器。其余两种插入的返回值都是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创建二维数组
以上方式都是针对数组每行元素相同