vector,是一个顺序表,是表示可变大小数组的序列容器:范型实现
vector:成员都为指针:T*
_start:第一个元素的起始位置,eg;int,第一个字节的位置
_finish:最后一个元素的结束位置,eg:int,最后一个字节的下一个字节位置
_endOfStorage:已分配好的空间结束位置
vector与string的区别:
1,迭代器生效问题:
(1)inser ( iterator it, T x) :插入可能会导致增容,会释放原有空间,开辟新的空间,拷贝原有内容
插入之前的迭代器位置可能已经失效,成为一个野指针
(2)erase ( iterator ) :访问越界
int a[] = {1,2,3,4,5,6,7};
vector<int> v1(a,a+sizeof(a)/sizeof(int))
//以下代码编译器会报错
//删除后可能会导致 vit 位置失效,对失效的迭代器++后程序会崩溃
auto vit = v1.begin();
while(vit != v1.end()){
if(*vit % 2 == 0){
v1.erase(vit);
}
//1,2,3,4,5
// 5 删完之后还会++一次,会跑到end()的后面,从而发生访问越界
vit++;
}
//要改成以下代码
//erase会返回删除位置后的下一个位置
//auto vit = v1.begin();
vector<int>::iterator vit = v1.begin();
while(vit != v1.end()){
if(*vit % 2 == 0)
vit = v1.erase(vit);
else
vit++;
}
2迭代器失效解决办法:
调用完 insert,erase接口后,重新获取迭代器,即获取接口的返回值,防止迭代器失效
3,swa函数:底层实现一样,本质上内部调用的为vector的成员函数
1)全局交换函数 swap(v1, v2); -->{ v1.swap(v2) }
2)成员函数交换 v1.swap(v2); -->v1.swap(v2)
3)通用成员函数交换:swap(T& v1, T& v2)-->{ T temp = s1; s1 = s2; s2 = temp; }
4,手动释放vector的空间
//手动释放vector空间
vector<int> v1(50, 1);
cout << v1.capacity() << endl;
v1.resize(0);//不能,只是改变内存中值的数量,无法改变容量的大小
v1.reserve(0);//不能,只是增容的,无法减少容量
//两种方法释放
{
vector<int>v2;//在局部域中定义一个空的临时的变量vector
v2.swap(v1);//调用vector swap函数,完成空间的交换
//然后走出括号调用v2的析构函数释放掉原v1的空间
}
{
//
v1.resize(0);//先将值清空
v1.shrink_to_fit();//将容量改变到合适的范围
}