C++ 中 ,iterator是容器类的内部类吗?

比如:vector<int>::iteratorit;这里iterator是属于vector的一个类,而it是iterator类的一个对象?是这样吗?如果不是类它怎么可以... 比如:vector<int>::iterator it;
这里iterator是属于vector的一个类,而 it 是iterator类的一个对象?是这样吗?如果不是类 它怎么可以定义一个it 对象呢。
有人说它是个模板类,是指针类型。 那模板类也是类吧, 它怎么又是指针类型呢?
展开
 我来答
百度网友fefbf9e
推荐于2017-09-01 · TA获得超过1364个赞
知道小有建树答主
回答量:176
采纳率:0%
帮助的人:105万
展开全部

“这里iterator是属于vector的一个类,而 it 是iterator类的一个对象?是这样吗?如果不是类 它怎么可以定义一个it 对象呢。”


iterator不是属于vector的类,它是一个独立的模板类,在vector内部重新typedef过。这种用法在模板中常出现,原因是iterator是一个通用工具,vector<int>可以用,vector<float>也可以用,而且其它容器(比如list)也需要迭代器,所以把iterator写成模板类,但是这个简单的模板类只有一些描述上的定义,并没有实现,也不可能实现,比如vector的迭代和list就是不一样的。只有当最终的iterator被明确下来之后(也就是明确它是vector<int>的迭代器还是list<float>的迭代器)才有可能实现,这个明确过程也就是指明模板参数。把它放到vector内部typedef的好处是可以这样

typedef __gnu_cxx::__normal_iterator<pointer, vector_type> iterator;//gcc

其中pointer和vector_type都是类型参数,当vector的类型确定了,pointer和vector_type的类型自动确定,那么iterator的类型同时也自动确定了,这看起来就像iterator和vector是共生的一样。有什么样的螺丝就需要什么样的螺丝刀,否则螺丝刀再漂亮,没有对号的螺丝也是没用的。


补充一点,::既可以访问一个class的内嵌class,也可以访问namespace,typedef,静态成员,枚举enum类型等等。


“有人说它是个模板类,是指针类型。   那模板类也是类吧, 它怎么又是指针类型呢?”


模板类刚才已经讲了。指针类型只是说iterator看起来像指针,用起来和指针没有区别,同时又比直接用指针安全。每个特定的容器,都有特定的内部内存结构,也就意味着遍历/迭代过程的细节是不一样的,举例来说,实现容器的同时需要为了向前迭代而实现以下几个操作符重载

operator*();//为了实现*p这种访问指针内容的功能
operator++();//指针后移
operator==(const TYPE &other);//判断俩指针是否指向同一地方

这些都是模板开发者为了使用方便,模拟做出来的指针效果

兮兮爱你
推荐于2017-10-07 · 这里有热播经典的,搞笑的电影电视集合。
兮兮爱你
采纳数:86 获赞数:12532

向TA提问 私信TA
展开全部
  不是。
  【资料】
  定义结构

  然而在前一种情况,容器承受了过多的功能,它不仅要负责自己“容器”内的元素维护(添加、删除等等),而且还要提供遍历自身的接口;而且由于遍历状态保存的问题,不能对同一个容器对象同时进行多个遍历。第二种方式倒是省事,却又将容器的内部细节暴露无遗。

  而迭代器模式的出现,很好的解决了上面两种情况的弊端。先来看下迭代器模式的真面目吧。

  迭代器模式由以下角色组成:

  1) 迭代器角色(Iterator):迭代器角色负责定义访问和遍历元素的接口。

  2) 具体迭代器角色(Concrete Iterator):具体迭代器角色要实现迭代器接口,并要记录遍历中的当前位置。

  3) 容器角色(Container):容器角色负责提供创建具体迭代器角色的接口。

  4) 具体容器角色(Concrete Container):具体容器角色实现创建具体迭代器角色的接口——这个具体迭代器角色与该容器的结构相关。

  迭代器模式的类图如下:

  从结构上可以看出,迭代器模式在客户与容器之间加入了迭代器角色。迭代器角色的加入,就可以很好的避免容器内部细节的暴露,而且也使得设计符合“单一职责原则”。

  注意,在迭代器模式中,具体迭代器角色和具体容器角色是耦合在一起的——遍历算法是与容器的内部细节紧密相关的。为
了使客户程序从与具体迭代器角色耦合的困境中脱离出来,避免具体迭代器角色的更换给客户程序带来的修改,迭代器模式抽象了具体迭代器角色,使得客户程序更
具一般性和重用性。这被称为多态迭代。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
purplerue
2013-07-18 · 超过14用户采纳过TA的回答
知道答主
回答量:60
采纳率:100%
帮助的人:45.8万
展开全部
我觉得iterrator能够肯定是,它一定是vector模板的一个内部名称,这个名称可以表示内部类,也可以是一个typedef(也就是说是一个外部类,由vector内部重新定义了名称),但对外都是Iterator。它的作用类似于指针,更确切的说是智能指针,以便像指针一样访问vector内部数据。各个编译器实现iterator的方法不完全相同。c++标准只定义了其功能和约束条件。在《Effesional C++》中,讲述了一个容器及其Iterator的实现。你可以看一下
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
zjfaok
2013-07-18 · TA获得超过6806个赞
知道大有可为答主
回答量:4146
采纳率:62%
帮助的人:1611万
展开全部

iterator是vector中的一个typedef,如VS的头文件是

typedef _Vector_iterator<_Mybase> iterator;

g++是

typedef __gnu_cxx::__normal_iterator<pointer, vector> iterator;

它们都没有把vector<...>::iterator作为直接包含在vector<...>类中的内部类……

本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
她是我的小太阳
高粉答主

2015-11-05 · 醉心答题,欢迎关注
知道顶级答主
回答量:5.1万
采纳率:83%
帮助的人:8942万
展开全部
iterator可以说是一个模板类,它是个指针类型,不是专属于某个类或类型的。它是一个类,但这个类实现了指针的功能,可以把它当做指针来理解和使用。
iterator是vector中的一个typedef,如VS的头文件是

typedef _Vector_iterator<_Mybase> iterator;

g++是

typedef __gnu_cxx::__normal_iterator<pointer, vector> iterator;
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(7)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式