C++11标准库(STL)使用总结——map/set等关联容器和vector/list/deque等序列容器的erase()使用总结(防止迭代器失效)

STL中的容器按存储方式分为两类,一类是按以数组形式存储的容器(如:vector 、deque); 另一类是以不连续的节点形式存储的容器(如:list、set、map)。在使用erase方法来删除元素时,需要注意一些问题,以避免引起不可预知错误或崩溃。

一、序列性容器

erase函数不仅使指向被删元素的迭代器失效,而且使被删元素之后的所有迭代器都失效。不能使用erase(iter++)的方式,因为使迭代器失效后就不能进行++了,所以会报错。但是直接将节点所指的下一个元素的迭代器,通过erase()函数返回值。所以正确方法为:

std::vector< int> Vec={1,2,3};
std::vector< int>::iterator itVec;
for( itVec = Vec.begin(); itVec != Vec.end(); ){
	if( FIND( *itVec) ){
		itVec = Vec.erase( itVec);
	}
	else{
		itList++;
	}
}

二、关联容器

erase()函数使当前元素的迭代器失效,所以可以使用++指向下一个元素。所以返回值为void。所以可以通过erase(iter++)的方式删除迭代器,正确方法为:

std::set< int> Set;
std::set< int>::iterator itSet;
Set.insert(1); Set.insert(2); Set.insert(3);
for( itSet = Set.begin(); itSet != Set.end(); ){
	if( FIND( *itSet) ){
		Set.erase( itSet++);
	}
	else{
		itSet++;
	}
}

list比较特殊,两种方式都行。

std::list< int> List;
std::list< int>::iterator itList;
for( itList = List.begin(); itList != List.end(); ){
	if( FIND( *itList) ){
		List.erase( itList++);
	}
	else{
		itList++;
	}
}

你可能感兴趣的:(C++,标准库STL)