首页 >后端开发 >C++ >如何使用基于范围的 For 循环使我的自定义 C 类型可迭代?

如何使用基于范围的 For 循环使我的自定义 C 类型可迭代?

Linda Hamilton
Linda Hamilton原创
2024-12-23 22:03:09611浏览

How Can I Make My Custom C   Types Iterable Using Range-Based For Loops?

使用自定义类型简化迭代

在 C 11 中,基于范围的 for 循环的引入简化了序列迭代的过程。这些循环遵循标准化模式:

for (Type& v : a) { ... } // equivalent to traditional loop below
for (auto iv = begin(a); iv != end(a); ++iv) {
  Type& v = *iv;
  ...
}

您可以将此功能扩展到您的自定义类型,允许它们在基于范围的循环中使用,遵循以下准则:

方法 1 :成员函数声明

  • 在类型 X 中定义 begin() 和 end() 成员函数,它们返回具有类似迭代器的对象

方法 2:自由函数调用

  • 在与类型 X 相同的命名空间中创建自由函数 begin(X&) 和 end(X&),再次返回迭代器类对象。

这些函数将为以下对象提供必要的初始化(begin())和终止(end())点基于范围的循环。

函数返回值要求

begin() 和 end() 返回的对象不需要是实际的迭代器。但是,它们必须满足以下要求:

  • 重载 pre- 以递增对象
  • 确保有效的初始化表达式
  • 支持二进制 != 布尔上下文
  • 实现一元 * 以返回可分配给循环的值变量
  • 提供公共析构函数

其他注意事项

  • 如果您的自定义类型属于xml命名空间,请定义xml::begin()以避免与 std::begin() 的潜在冲突。
  • 未来的 C 修订版可能会解耦以下类型begin() 和 end(),允许“惰性结束”计算。
  • C 17 引入了一种新类型 null_sentinal_t,它有助于在空终止字符缓冲区上进行基于范围的循环。
  • 基于范围的循环使用存储在 auto&& 引用中的临时变量,这意味着您的 begin() 和 end() 重载无法检测它们是否正在运行临时的。

以上是如何使用基于范围的 For 循环使我的自定义 C 类型可迭代?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn