C++学习笔记8——迭代器(iterator)

1,迭代器类型
每种容器都定义了自己的迭代器类型。所以定义迭代器时,必须指明数据类型。如:
vector<int>::iterator iter;
iter代表的是vector中元素的位置,要想获取元素具体的值,使用解引用操作符。
*iter = 2;
2,begin与end
每种容器都定义了一对名为begin与end的成员函数,用于返回迭代器。
vector<int>::iterator iter = ivec.begin();
begin返回的是容器中的第一个元素;
end不指向真实的元素,其返回的是最后一个元素之后的位置(off-the-end iterator).
因为不指向真实的元素,所以也就不能对其返回的值解引用。

3,自增操作
从当前位置指向下一个位置用自增操作
++iter;
iter++;

4,比较
判断两个迭代器是否相等(是否指向相同的位置)可以使用== 和 !=号来判断。
大于、小于判断亦可。

使用示例:
        ivec.push_back(0);
	ivec.push_back(1);
	ivec.push_back(2);
	ivec.push_back(2);
	ivec.push_back(2);
	ivec.push_back(3);
	ivec.push_back(4);
	cout << "before: ivec.size " << ivec.size() << endl;

	for (vector<int>::iterator iter = ivec.begin(); iter != ivec.end(); iter++)
	{
		cout << *iter << endl;
	}

	vector<int>::iterator iter2 = ivec.begin() + 2;//改变长度之前的迭代器
	cout << "*iter2 = " << *iter2 << endl;

	//删除
	for (vector<int>::iterator iter = ivec.begin(); iter != ivec.end(); )
	{
		if (*iter == 2)
		{
			iter = ivec.erase(iter);//删除后返回下一个位置
		}
		else
		{
			iter++;
		}
	}

	cout << "after: ivec.size " << ivec.size() << endl;


5,const_iterator
类似于const引用,const_iterator本身的值可以改变,即可以指向不同的对象,但是不能通过它改变其指向的对象的值。换言之,可以用来获取对象的值,但不能用来改变对象的值。
vector<int>::const_iterator iter;
*iter = 2;//error!!

6,迭代器的算术运算
并不是所有迭代器都支持这些算术运算,但是vector迭代器支持。
(1)加法:iter1 + n
              iter1 - n
比如 ivec.begin() + 2即为指向第2个元素(从0开始数)
(2)减法:iter1 - iter2
这个减法运算返回difference_type类型,其为signed类型。
vector<int>::difference_type delt;

注意:不能将两个迭代器相加!

7,迭代器失效
在改变vector的长度之后,比如经过push_back()或者erase()操作之后,已经存在的迭代器会失效。
比如下面的代码:
        vector<int> ivec(5,1);
	vector<int>::iterator iter2 = ivec.begin() + 2;//改变长度之前的迭代器
	cout << "before *iter2 = " << *iter2 << endl;

	//改变ivec长度
	ivec.push_back(2);

	//改变长度之后再次输出原迭代器
	cout << "after *iter2 = " << *iter2 << endl;
编译通过,但是运行时报错。


错误信息显示该迭代器是不可解引用的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值