【C++】STL容器的迭代器经过各种操作后的状态

C++中STL容器的迭代器经过各种操作后的状态

1. vector

1) erase

主要代码如下,其中showvector为遍历容器输出所有元素的函数。

int main()
{
	vector<int> a = {0, 1, 2, 3, 4, 5};    
	vector<int>::iterator it;    
	it = a.begin() + 3;    
	showvector(a);    
	cout << *it << endl;    
	a.erase(a.begin() + 1);    
	showvector(a);    
	cout << *it << endl;
	system("PAUSE");    
	return 0;
}

删除的是迭代器之前的元素:指向下一个元素。
运行结果
删除的是迭代器本身指向的元素:指向下一个元素。
运行结果
删除的是迭代器之后的元素:指向的元素不变。
运行结果

it = a.erase(a.begin()+4);

运行结果
其中,erase的返回值为移除的元素的下一个元素的迭代器。
小结:对于vector而言,进行erase操作后,迭代器可以类比数组(迭代器相当于偏移地址)。将erase操作视为移除某个元素,将其所有元素向前挪一位来填补这个空缺。

2)insert

int main()
{
 vector<int> a = {0, 1, 2, 3, 4, 5};    
 vector<int>::iterator it;    
 it = a.begin() + 3;    
 showvector(a);    
 cout << *it << endl;    
 a.insert(a.begin() + 1, 9);    
 showvector(a);    
 cout << *it << endl;
 system("PAUSE");    
 return 0;
}

插入在迭代器之前:
运行结果
迭代器失效。
插入在迭代器之后:
运行结果
迭代器失效。
小结:一插就失效。建议将insert的返回值赋给迭代器。

it = a.insert(a.begin() + 4, 9);

运行结果
其中,insert的返回值为插入元素的迭代器。

2. list

1) erase

int main()
{
	list<int> b = {0, 1, 2, 3, 4, 5};
	list<int>::iterator it2, it3;
	it3 = it2 = b.begin();
	advance(it2, 3);
	advance(it3, 2);
	showlist(b);
	cout << *it2 << endl;
	b.erase(it3);
	showlist(b);    
	cout << *it2 << endl;    
	system("PAUSE");    
	return 0;
}

分别删除指定迭代器之前和之后的元素:指向的元素都不变。
运行结果
运行结果
小结:list的结构类似链表,删除只是改变了指针指向的地址,原本迭代器指向的元素不会改变。

it2 = b.erase(it3);

其中,erase返回的是删除的元素的后继元素。
运行结果

2) insert

int main()
{
 	list<int> b = {0, 1, 2, 3, 4, 5};
 	list<int>::iterator it2, it3;
 	it3 = it2 = b.begin();
 	advance(it2, 3);
 	advance(it3, 2);
	showlist(b);
 	cout << *it2 << endl;
	b.insert(it2, 9);
 	showlist(b);    
 	cout << *it2 << endl;    
 	system("PAUSE");    
 	return 0;
}

分别插入到对应迭代器之前和之后: 指向元素都不变。
运行结果
运行结果

it2 = b.insert(it3, 9);

其中,insert返回插入的元素的迭代器。
运行结果
小结:类似erase操作。

3. 待拓展

总结(待拓展)

容器类型\操作类型eraseinsert待拓展
vector删除之前或本身,指向后继元素;删除之后的元素,不变失效
list指向元素不变指向元素不变
待拓展
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值