C++ 中 ,iterator是容器类的内部类吗?
这里iterator是属于vector的一个类,而 it 是iterator类的一个对象?是这样吗?如果不是类 它怎么可以定义一个it 对象呢。
有人说它是个模板类,是指针类型。 那模板类也是类吧, 它怎么又是指针类型呢? 展开
“这里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);//判断俩指针是否指向同一地方
这些都是模板开发者为了使用方便,模拟做出来的指针效果
【资料】
定义结构
然而在前一种情况,容器承受了过多的功能,它不仅要负责自己“容器”内的元素维护(添加、删除等等),而且还要提供遍历自身的接口;而且由于遍历状态保存的问题,不能对同一个容器对象同时进行多个遍历。第二种方式倒是省事,却又将容器的内部细节暴露无遗。
而迭代器模式的出现,很好的解决了上面两种情况的弊端。先来看下迭代器模式的真面目吧。
迭代器模式由以下角色组成:
1) 迭代器角色(Iterator):迭代器角色负责定义访问和遍历元素的接口。
2) 具体迭代器角色(Concrete Iterator):具体迭代器角色要实现迭代器接口,并要记录遍历中的当前位置。
3) 容器角色(Container):容器角色负责提供创建具体迭代器角色的接口。
4) 具体容器角色(Concrete Container):具体容器角色实现创建具体迭代器角色的接口——这个具体迭代器角色与该容器的结构相关。
迭代器模式的类图如下:
从结构上可以看出,迭代器模式在客户与容器之间加入了迭代器角色。迭代器角色的加入,就可以很好的避免容器内部细节的暴露,而且也使得设计符合“单一职责原则”。
注意,在迭代器模式中,具体迭代器角色和具体容器角色是耦合在一起的——遍历算法是与容器的内部细节紧密相关的。为
了使客户程序从与具体迭代器角色耦合的困境中脱离出来,避免具体迭代器角色的更换给客户程序带来的修改,迭代器模式抽象了具体迭代器角色,使得客户程序更
具一般性和重用性。这被称为多态迭代。
iterator是vector中的一个typedef,如VS的头文件是
typedef _Vector_iterator<_Mybase> iterator;
g++是
typedef __gnu_cxx::__normal_iterator<pointer, vector> iterator;
它们都没有把vector<...>::iterator作为直接包含在vector<...>类中的内部类……
iterator是vector中的一个typedef,如VS的头文件是
typedef _Vector_iterator<_Mybase> iterator;
g++是
typedef __gnu_cxx::__normal_iterator<pointer, vector> iterator;