C++笔记8•vector•

容器之vector

1.vector介绍

(1).vector是表示可变大小数组的序列容器;

(2).vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对 vector 的元素
进行访问,和数组一样高效。但是又不像数组,它的大小是可以动态改变的,而且它的大小会被容器自动处理。容量不够时,会主动申请空间进行增容,这时旧空间的数据需要拷贝到新空间中。

2.vector使用

vector官方文档介绍

构造函数、拷贝构造、析构函数、迭代器、容量空间、增删查改接口

3.vector迭代器失效

(1).迭代器失效:就是原生空间释放后,再次去访问使用,触发编译器程序错误。

迭代器的主要作用就是让算法能够不用关心底层数据结构,其底层实际就是一个 指针 ,或者是对指针进行了 封装(后面介绍到的list就是这样的) ,比如: vector 的迭代器就是原生态指针 T* 。因此 迭代器失效,实际就是迭代器底层对应指针所指向的 空间被销毁了,而使用一块已经被释放的空间 ,造成的后果是程序崩溃 ( 如果继续使用已经失效的迭代器, 程序可能会崩溃 )
(2). 会引起其底层空间改变的操作,都有可能是迭代器失效 ,比如: resize reserve insert assign push_back等。指定位置元素的删除操作 - -erase
 v.erase(pos);// 删除pos位置的数据,导致pos迭代器失效。
 cout << *pos << endl; // 此处会导致非法访问
#include <iostream>
using namespace std;
#include <vector>
int main()
{
 int a[] = { 1, 2, 3, 4 };
 vector<int> v(a, a + sizeof(a) / sizeof(int));
 // 使用find查找3所在位置的iterator
 vector<int>::iterator pos = find(v.begin(), v.end(), 1);
 // 删除pos位置的数据,导致pos迭代器失效。
 v.erase(pos);
 cout << *pos << endl; // 此处会导致非法访问
 return 0;
}

//解决方法
#include <iostream>
using namespace std;
#include <vector>
int main()
{
	int a[] = { 1, 2, 3, 4 };
	vector<int> v(a, a + sizeof(a) / sizeof(int));
	// 使用find查找3所在位置的iterator
	vector<int>::iterator pos = find(v.begin(), v.end(), 1);//找对象v中 是否有1
	// 删除pos位置的数据后,后面的数据需要往前移动,进行补齐 erase(pos)的返回值是一个迭代器,返回给pos,就可以再次访问了,如果不返回给pos,再次访问迭代器失效,就会导致非法访问
    //cout << &*pos << endl;
	pos=v.erase(pos);//解决方法  
    //cout << &*pos << endl;
	cout << *pos << endl; // 此处不会导致非法访问
	return 0;
}

※注意:防止迭代器失效解决办法:在使用前,对迭代器重新赋值即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值