迭代器以及如何获得迭代器地址

本文介绍了迭代器模式,它为容器而生,提供访问容器元素的方法且不暴露内部细节。阐述了其好处,解决了容器功能过多和遍历状态保存等问题。还说明了迭代器模式的构成角色,最后提及迭代器实现中不能用cout打印地址值及获取地址的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

data structure的定义:More precisely, a data structure is a collection of data values, the relationships among them, and the functions or operations that can be applied to the data.[4]

迭代器

定义:迭代器(iterator)提供一种方法访问一个容器(container)对象中各个元素,而又不需暴露该对象的内部细节。 从定义可见,迭代器模式是为容器而生。
好处:没有迭代器,如果将便利方法全部塞进容器中,容器承受了过多的功能,它不仅要负责自己“容器”内的元素维护(添加、删除等等),而且还要提供遍历自身的接口;而且由于遍历状态保存的问题,不能对同一个容器对象同时进行多个遍历。如果让用户自己实现容器的遍历倒是省事,却又将容器的内部细节暴露无遗。而迭代器模式的出现,很好的解决了上面两种情况的弊端。
构成迭代器模式由以下角色组成:

  1. 迭代器角色(Iterator):迭代器角色负责定义访问和遍历元素的接口。
  2. 具体迭代器角色(Concrete Iterator):具体迭代器角色要实现迭代器接口,并要记录遍历中的当前位置。
  3. 容器角色(Container):容器角色负责提供创建具体迭代器角色的接口。
  4. 具体容器角色(Concrete Container):具体容器角色实现创建具体迭代器角色的接口——这个具体迭代器角色与该容器的结构相关。
    在这里插入图片描述
    implement-实现
    interface-接口

不可以用cout打印iterator的地址值
如cout<<ivec.begin();因为没有定义iterator的重载运算符

如何获得iterator的地址
一般来说,迭代器是个数据结构,会将真实的数据地址保存在某个内部的成员变量中,并重载各种运算符(比如解引用运算符*)。

要取得数据地址,使用 &* 或者 std::addressof(iterator)

#include <iostream>
#include <vector>
using namespace std;

int main(){
	vector<int> vecInt;
	for(int i = 10; i != 15; i++){
		vecInt.push_back(i);
	}
	
	//address of iter and end
	vector<int>::iterator iter = vecInt.begin();
	while(iter != vecInt.end()){
		cout << "addr of iter: " << &*iter << ", addr of end: " << &*vecInt.end() << endl;
		iter++;
	}
	
	return 0;
}
--------------------- 
作者:emmmzhang 
来源:优快云 
原文:https://blog.csdn.net/hl_zzl/article/details/84575713 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值