使用自定义类型简化迭代
在 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中文网其他相关文章!