将“基于范围的 for 循环”与自定义类型结合使用
自定义类型集成
要在自定义类型上启用“基于范围的 for 循环”,您可以实现以下:
命名空间注意事项
返回值要求
返回的对象begin() 和 end() 不需要是实际的迭代器。它们必须满足以下要求:
解耦类型
在 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& x){ return x.data.data(); } int* end(some_struct_you_do_not_control& x){ return x.data.data()+x.data.size(); } int const* cbegin(some_struct_you_do_not_control const& x){ return x.data.data(); } int* cend(some_struct_you_do_not_control const& x){ return x.data.data()+x.data.size(); } int const* begin(some_struct_you_do_not_control const& x){ return cbegin(x); } int const* end(some_struct_you_do_not_control const& x){ return cend(x); } }现在,您可以使用基于范围的 for 循环迭代向量:
library_ns::some_struct_you_do_not_control s; for (int i : s) { // ... }
自定义类型示例
对于您控制的自定义类型,您可以定义直接在类型中的begin() 和 end() 方法:
以上是如何使用 C 中基于范围的 For 循环使我的自定义类型可迭代?的详细内容。更多信息请关注PHP中文网其他相关文章!