【C++】iterator迭代器的使用

参考:

  1. https://www.cnblogs.com/betteryi/p/3774541.html
  2. https://blog.csdn.net/qq_36621927/article/details/78458272

一、简介:

除了使用下标来访问vector对象的元素外,标准库还提供了另一种检测元素的方法:使用迭代器(iterator)。迭代器是一种允许程序员检查容器内元素,并实现元素遍历的数据类型

所有的标准库容器类都定义了相应的iterator类型,如vector:

vector<int>::iterator iter;

这条语句定义了一个名为iter的变量,它的数据类型是由vector<int>定义的iterator类型。

vector<int>::iterator iter=vt.begin();//起始地址
vector<int>::iterator iter_end=vt.end();//结束地址

两个地址都是指针类型,end操作返回的迭代器指向vector的“末端元素的下一个”,指向了一个不存在的元素

vector为空,beginend返回的迭代器相同。

end操作返回的迭代器并不指向vector中任何实际的元素,相反,它只是起一个哨兵(sentinel)的作用,表示我们已处理完vector中所有元素。

二、使用

  1. 使用迭代器遍历vector元素:
vector<int> ivec(1,2);
for(vector<int>::iterator iter=ivec.begin();iter!=ivec.end();++iter)
{
*iter = 0; //使用 * 访问迭代器所指向的元素
}

注意vector<int>::const_iteratorconst vector<int>::iterator有区别:

const vector<int>::iterator newiter=ivec.begin();
*newiter=0; //可以修改指向容器的元素
//newiter++; //迭代器本身不能被修改 
  1. 迭代器基本操作:

iter++, ++iter, iter- -, --iter, iter+n, iter-n, iter1-iter2

  1. 任何改变vector长度的操作都会使已存在的迭代器失效

例如,在调用push_back之后,就不能再信赖指向vector的迭代器的值了。

修改容器的内在状态或者移动容器内的元素,这样的操作使得所有指向被移动的元素的迭代器失效,也可能同时使得其他迭代器失效

例如,添加元素时,可能会导致容器的重新加载,这样该容器涉及的迭代器都将失效。即使不重新加载,指向新插入元素后面的那个元素的迭代器也会失效。

任何insertpush操作都可能导致迭代器失效,因此要确保迭代器每次循环后都得到更新。

示例:

vector<int>::iterator first = v.begin(),
last = v.end(); // cache end iterator
// Diaster: behavior of this loop is undefined
while (first != last) {
  // do some processing
  // insert new value and reassign first, which otherwise would be invalid
  first = v.insert(first, 42);
  ++first; // advance first just past the element we added
}

上述代码的行为是未定义的。在很多实现中,该段代码将导致死循环。
问题在于这个程序将 end 操作返回的迭代器值存储在名为 last 的局部变量中。
循环体中实现了元素的添加运算,添加元素会使得存储在 last 中的迭代器失效。
该迭代器既没有指向容器 v 的元素,也不再指向 v 的超出末端的下一位置。
添加或删除 dequevector 容器内的元素都会导致存储的迭代器失效。所以,不要存储 end 操作返回的迭代器。
为了避免存储 end 迭代器,可以在每次做完插入运算之后重新计算 end 迭代器值,例如:

// Safer: recalculate end on each trip whenever the loop adds/erases elements
while (first != v.end()) {
  // do some processing
  first = v.insert(first, 42); // insert new value
  ++first; // advance first just past the element we added
}

3.通俗理解:

  1. 可以直接把iterator当成一个指针来看,比如说 :
vector<int> v; 
vector<int>::iterator iter; 
// 其实里面的iterator 你可以这么理解typedef int* iterator; 
// 是一个指向所属容器的指针 
iter = v.begin()//指向v容器的第一个元素 

可以对iter做增与减的操作 :

++iter; 
--iter;
  1. vector<int> 是向量类型,而vector<int>::iterator是向量的迭代器类型,vector<int>::iterator用于迭代vector<int>中的int数据。

  2. vector<int> 向量类型的向量V中的int数据都输出:

for(it=v.begin();it!=v.end();it++)
     cout<<*it<<endl;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值