首頁 >後端開發 >C++ >如何使用 C 中基於範圍的 For 循環使我的自訂類型可迭代?

如何使用 C 中基於範圍的 For 循環使我的自訂類型可迭代?

Patricia Arquette
Patricia Arquette原創
2024-12-28 22:06:15561瀏覽

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

命名空間:

現在,您可以使用基於範圍的for循環迭代向量:
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); }
}

library_ns::some_struct_you_do_not_control s;
for (int i : s) {
  // ...
}
自訂類型範例

對於您控制的自訂類型,您可以定義直接在類型中的

begin( )

end() 方法:

以上是如何使用 C 中基於範圍的 For 循環使我的自訂類型可迭代?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn