將“基於範圍的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; }; }
命名空間:
現在,您可以使用基於範圍的for循環迭代向量: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); } }
library_ns::some_struct_you_do_not_control s; for (int i : s) { // ... }
對於您控制的自訂類型,您可以定義直接在類型中的
begin( )和end() 方法:
以上是如何使用 C 中基於範圍的 For 循環使我的自訂類型可迭代?的詳細內容。更多資訊請關注PHP中文網其他相關文章!