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

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

Patricia Arquette
Patricia Arquette原创
2024-12-28 22:06:15620浏览

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

将“基于范围的 for 循环”与自定义类型结合使用

自定义类型集成

要在自定义类型上启用“基于范围的 for 循环”,您可以实现以下:

  • 成员函数: 定义 begin()end() 返回充当迭代器的对象的成员函数。
  • 自由函数:创建自由函数begin(Type&)end(Type&) 与您的自定义类型具有相同的命名空间,返回行为类似于迭代器的对象。

命名空间注意事项

  • 如果您的自定义类型属于xml 命名空间,定义 xml::begin()xml::end() 以确保正确的命名空间关联。

返回值要求

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

  • 实现 pre- ,确保初始化表达式有效。
  • 实现二进制 != 进行布尔比较.
  • 实现一元 * 来提供用于分配给循环变量的值。
  • 公开公共析构函数。

解耦类型

在 C 17 中,开始结束已解耦。这允许结束迭代器具有与开始迭代器不同的类型。这对于仅支持 != 和 begin 迭代器类型的“哨兵”迭代器非常有用,可以在空终止字符缓冲区上进行高效迭代。

库扩展示例

考虑一个库类型

some_struct_you_do_not_control 包含整数向量,但没有 begin()end() 方法。

namespace library_ns {
  struct some_struct_you_do_not_control {
    std::vector<int> data;
  };
}
这种类型是可迭代的,您可以将以下函数添加到

library_ns 命名空间:

namespace library_ns {
  int* begin(some_struct_you_do_not_control&amp; x){ return x.data.data(); }
  int* end(some_struct_you_do_not_control&amp; x){ return x.data.data()+x.data.size(); }
  int const* cbegin(some_struct_you_do_not_control const&amp; x){ return x.data.data(); }
  int* cend(some_struct_you_do_not_control const&amp; x){ return x.data.data()+x.data.size(); }
  int const* begin(some_struct_you_do_not_control const&amp; x){ return cbegin(x); }
  int const* end(some_struct_you_do_not_control const&amp; x){ return cend(x); }
}
现在,您可以使用基于范围的 for 循环迭代向量:

library_ns::some_struct_you_do_not_control s;
for (int i : s) {
  // ...
}

自定义类型示例

对于您控制的自定义类型,您可以定义直接在类型中的

begin()end() 方法:

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

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