迭代器及嵌套类介绍

迭代器(iterator是一种对象,它能够用来遍历标准模板库容器中的部分或全部元素,每个迭代器对象代表容器中的确定的地址。迭代器修改了常规指针的接口,所谓迭代器是一种概念上的抽象:那些行为上像迭代器的东西都可以叫做迭代器。然而迭代器有很多不同的能力,它可以把抽象容器和通用算法有机的统一起来。

代器提供一些基本操作符:*++==!==。这些操作和C/C++“操作array元素时的指针接口一致。不同之处在于,迭代器是个所谓的复杂的指针,具有遍历复杂数据结构的能力。其下层运行机制取决于其所遍历的数据结构。因此,每一种容器型都必须提供自己的迭代器。事实上每一种容器都将其迭代器以嵌套的方式定义于内部。因此各种迭代器的接口相同,型号却不同。这直接导出了泛型程序设计的概念:所有操作行为都使用相同接口,虽然它们的型别不同。

功能

迭代器使开发人员能够在类或结构中支持foreach迭代,而不必整个实现IEnumerable或者IEnumerator接口。只需提供一个迭代器,即可遍历类中的数据结构。当编译器检测到迭代器时,将自动生成IEnumerable接口或者IEnumerator接口的CurrentMoveNextDispose方法。

特点

1.迭代器是可以返回相同类型值的有序序列的一段代码;

2.迭代器可用作方法、运算符get访问器的代码体;

3.迭代器代码使用yield return语句依次返回每个元素,yield break将终止迭代;

4.可以在类中实现多个迭代器,每个迭代器都必须像任何类成员一样有惟一的名称,并且可以在foreach语句中被客户端,代码调用如下所示:foreach(int x in SimpleClass.Iterator2){}

5.迭代器的返回类型必须为IEnumerableIEnumerator中的任意一种;

6.迭代器是产生值的有序序列的一个语句块,不同于有一个 或多个yield语句存在的常规语句块;

7.迭代器不是一种成员,它只是实现函数成员的方式,理解这一点是很重要的,一个通过迭代器实现的成员,可以被其他可能或不可能通过迭代器实现的成员覆盖和重载

8.迭代器块在C#语法中不是独特的元素,它们在几个方面受到限制,并且主要作用在函数成员声明的语义上,它们在语法上只是语句块而已;

9.yield关键字用于指定返回的值。到达yieldreturn语句时,会保存当前位置。下次调用迭代器时将从此位置重新开始执行。 迭代器对集合类特别有用,它提供一种简单的方法来迭代不常用的数据结构(如二进制树)。

简介

迭代器是一种检查容器内元素并遍历元素的可带泛型数据类型。

#include<iostream>
 
using namespace std;
 
class _iterator
{
    private:
            char *p;
    public:
            _iterator(char*str):p(str){}
            char*&operator++()
            {    
                p+=1;//跟p++同价;
                return p;
            }
};
 
int main()
{
    char *p="This is C++ program";
    _iterator it(p);
    cout<<"++之前:"<<p<<endl;
    char*p1=++it;  //把地址向前加了一个char型长度,然后给指针p1
    cout<<"++之后:"<<p1<<endl;
    return 0;
}

 

嵌套类

在一个类体中定义的类叫作嵌套类。拥有嵌套类的类叫外围类。

定义嵌套类的初衷是建立仅供某各类使用的类,目的在于隐藏类名,减少全局的标识符,从而限制用户能否使用该类建立对象。这样可以提高类的抽象能力,并且强调了两个类(外围类和嵌套类)之间的主从关系。

1 嵌套类对于外围类:

1.嵌套类仅仅是声明在外围类内部的类型,而不是外围类的成员

2.围类不具备嵌套类所定义的成员

3.对于外围类来说,嵌套类和其他的类没有任何区别;外围类能访问嵌套类对象的public成员,不能访问嵌套类对象的protectedprivate成员

2 外围类对于嵌套类:

1. 嵌套类不具备外围类所定义的成员

2. 嵌套类能访问外围类的public成员,不能访问外围类的protectedprivate成员

3嵌套类对于外围类外部的作用域:

1.无论嵌套类声明为publicprotected还是private,嵌套类对于外围类任何成员可见

2.当嵌套类在外围类中声明为public时,对外围类之外的作用域可见,外围类之外的作用域可通过“::”访问嵌套类;

相关说明

1)类的私有成员只有类的成员和友元可以访问,因此外围类不可以访问嵌套类的私有成员。嵌套类可以访问外围类的成员(通过对象、指针或者引用)。

2)嵌套类既可为私有,也可为公有。在上面的例子中,嵌套类B的访问权限是public,可以在外围类的成员函数之外使用该嵌套类,使用时加上名字限定。如果将嵌套类B的访问权限设置为private,那么只能在外围类内使用。 

3)嵌套类中的成员函数可以在它的类体外定义。

4)嵌套类可以直接访问外围类的静态成员、类型名( typedef )、枚举值。

以嵌套类对外围类的静态成员变量的访问为例,访问方式通过”ClassName::staticVarName”来直接访问。

学如逆水行舟,不进则退。 博客园技术交流群 群 号:1073255314 (本群没人,刚刚建立 -_-!!! )
原文地址:https://www.cnblogs.com/Mj-NaijAm/p/13601723.html