使用自訂類型簡化迭代
在 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中文網其他相關文章!