购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

1.9 对自定义类型使用基于range的for循环

正如我们在上一节中看到的,基于range的for循环(在其他编程语言中称为for each)允许遍历range的元素,相比标准for循环提供了简化的语法,并使代码在许多情况下更具可读性。但是,基于range的for循环不能直接适用于任何表示range的类型,而是需要begin()和end()函数(对于非数组类型)作为成员函数或自由函数。在本节中,我们将学习如何为自定义类型使用基于range的for循环。

1.9.1 准备工作

如果你需要了解基于range的for循环是如何工作的,以及编译器为这样的循环生成什么代码,那么建议你在继续阅读本节之前,先阅读一下1.8节的内容。

为了演示如何对用户自定义序列使用基于range的for循环,我们将使用如下简单数组的实现:

此方法的目的是支持编写如下代码:

使这一切成为可能所需的步骤将在下面详细描述。

1.9.2 使用方式

要想对用户自定义类型使用基于range的for循环,需要执行以下操作:

❍ 为类型创建可变迭代器和常量迭代器,必须实现:

· operator++(包含前缀版本和后缀版本)——用于递增迭代器;

· operator*——用于解引用迭代器并访问迭代器所指向的实际元素;

· operator!=——用于与另一个迭代器进行比较。

❍ 为类型提供自由函数begin()和end()。

基于前面的简单range示例,我们需要提供以下内容:

❍ 以下迭代器类的最简洁实现:

❍ 可变迭代器和常量迭代器的模板别名:

❍ 自由函数begin()和end()返回相应的begin和end迭代器,对两个模板别名都有重载:

1.9.3 工作原理

有了这样的实现,前面显示的基于range的for循环将按预期编译和执行。在执行参数依赖查找时,编译器将识别我们编写的两个函数begin()和end()(它们接受dummy_array的引用),因此它生成的代码是有效的。

在前面的例子中,我们定义了一个迭代器类模板和两个模板别名,分别称为dummy_array_iterator和dummy_array_const_iterator。对于这两种类型的迭代器,begin()和end()函数都有重载。

考虑到容器可以在基于range的for循环中使用常量和非常量实例,这是很有必要的:

简单range类使用基于range的for循环的另一种方法是提供begin()和end()成员函数,一般来说,只有当你拥有并能够修改源代码时,这才有意义。另外,本节中显示的解决方案在所有情况下都有效,应该优先于其他备选方案。

1.9.4 延伸阅读

❍ 阅读1.2节,以了解类型的别名。

❍ 阅读12.5节,以学习C++20 range库的基础知识。 l+bTMYSWjKl5vJ72XntV8zwWQZdWq4Ezfvb5oCcSjWSLEJH9XSUnz4ix3dqQ3sWW

点击中间区域
呼出菜单
上一章
目录
下一章
×