STL知识点 | 迭代器的作用、有指针为何还要迭代器、迭代器是如何删除元素的

  1. 迭代器
  • iterator(迭代器)模式又称 Cursor(游标)模式,用于提供一种方法顺序访问一个聚合对象中各个元素,而又不需暴露该对象的内部表示。或者这样说可能更容易理解:iterator模式是运用于聚合对象的—种模式,通过运用该模式,使得我们可以在不知道对象内部表示的凊况下,按照一定顺序(由 iterator提供的方法)访问聚合对象中的各个元素。
  • 由于 Iterator模式的以上特性:与聚合对象耦合,在一定程度上限制了它的广泛运用,一般仅用于底层聚合支持类,如STL的list、 vector、 stack等容器类及iostream_iterator等扩展 iterator。
  1. 迭代器与指针的区别
  • 迭代器不是指针,是类模板,表现的像指针。他只是模拟了指针的—些功能,通过重载了指针的一些操作符,->、*、++、–等。迭代器封装了指针,是—个“可遍历STL( Standard Template Library)容器内全部或部分元素”的对象,本质是封装了原生指针,是指针概念的种提升,提供了比指针更高级的行为,相当于种智能指针,他可以根据不同类型的数据结构来实现不同的++,–等操作。
  • 迭代器返回的是对象引用而不是对象的值,所以cout只能出迭代器使用值后的值而不能直接输出其自身。
  1. 迭代器产生的原因
  • Iterator类的访问方式就是把不同集合类的访问逻辑抽象出来,使得不用暴露集合内部的结构而达到循环遍历集合的效果。
  1. 迭代器如何删除元素
  • 对于序列容器 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); //直接返回下一个有效的迭代器,不需要+1
     }
     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++); // 传给erase的是iter的一个副本,iter++是下一个有效的迭代器。
     else
         ++iter;
}
  • 对于list来说,由于它使用了不连续分配的内存,并且它的erase方法也会自动返回下一个有效的 iterator,因此上面两种容器的正确的删除方法都可以使用。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值