迭代器
iterator(迭代器)模式又称 Cursor(游标)模式,用于提供一种方法顺序访问一个聚合对象中各个元素,而又不需暴露该对象的内部表示。或者这样说可能更容易理解:iterator模式是运用于聚合对象的—种模式,通过运用该模式,使得我们可以在不知道对象内部表示的凊况下,按照一定顺序(由 iterator提供的方法)访问聚合对象中的各个元素。 由于 Iterator模式的以上特性:与聚合对象耦合,在一定程度上限制了它的广泛运用,一般仅用于底层聚合支持类,如STL的list、 vector、 stack等容器类及iostream_iterator等扩展 iterator。
迭代器与指针的区别
迭代器不是指针,是类模板,表现的像指针。他只是模拟了指针的—些功能,通过重载了指针的一些操作符,->、*、++、–等。迭代器封装了指针,是—个“可遍历STL( Standard Template Library)容器内全部或部分元素”的对象,本质是封装了原生指针,是指针概念的种提升,提供了比指针更高级的行为,相当于种智能指针,他可以根据不同类型的数据结构来实现不同的++,–等操作。 迭代器返回的是对象引用而不是对象的值,所以cout只能出迭代器使用值后的值而不能直接输出其自身。
迭代器产生的原因
Iterator类的访问方式就是把不同集合类的访问逻辑抽象出来,使得不用暴露集合内部的结构而达到循环遍历集合的效果。
迭代器如何删除元素
对于序列容器 vector, deque来说,使用 erase(itertor)后,后边的每个元素的迭代器都会失效,但是后边每个元素都会往前移动一个位置,并且erase会返回下一个有效的迭代器。
vector< int > nums = { 1 , 2 , 3 , 4 , 5 , 6 , 8 , 9 , 10 } ;
vector< int > :: iterator iter;
for ( iter = nums. begin ( ) ; iter != nums. end ( ) ; )
{
if ( 5 == * iter) {
iter = nums. erase ( iter) ;
}
else {
++ iter
}
}
对于关联容器 map、set来说,使用了 erase(iterator)后,当前元素的迭代器失效,但是其结构是红黑树,删除当前元素的,不会影响到下一个元素的迭代器,所以在调用erase之前,记录下一个元素的迭代器即可。
set< int > nums = { 1 , 2 , 3 , 4 , 5 , 6 , 8 , 9 , 10 } ;
set< int > :: iterator iter;
for ( iter = nums. begin ( ) ; iter != nums. end ( ) ; )
{
if ( 5 == * iter)
nums. erase ( iter++ ) ;
else
++ iter;
}
对于list来说,由于它使用了不连续分配的内存,并且它的erase方法也会自动返回下一个有效的 iterator,因此上面两种容器的正确的删除方法都可以使用。