假設我有一個MyInputIter滿足概念的輸入迭代器型別(我用它來遍歷樹狀結構)std::input_iterator。
有什么理由我不應該在迭代器本身上定義begin()和?end()
struct MyInputIter
{
// iterator stuff omitted
auto begin() const { return *this; }
auto end() const { return MySentinel{}; }
};
原因是我不必為了包裝begin而創建另一種型別,end因此我可以在 for 回圈中使用它:
MyInputIter iterate(TreeNode root, FilterPattern pattern)
{
return MyInputIter{ root, pattern };
}
void foo()
{
for (auto item : iterate(someRandomTreeNode, "*/*.bla"))
process(item);
}
同時還可以將其用作迭代器:
std::vector<TreeNode> vec(iterate(someRandomTreeNode, "*"), MySentinel{});
uj5u.com熱心網友回復:
有什么理由不應該在迭代器本身上定義 begin() 和 end() 嗎?
需要考慮的潛在問題:
- 為迭代器實作這些功能可能很昂貴。要么是因為需要遍歷結構來找到它們,要么是因為迭代器中存盤了額外的狀態。
- 它可能會令人困惑,因為它偏離了常見的模式。編輯:正如康桓瑋所指出的,迭代器的范圍在 中是有先例的
std::filesystem::directory_iterator,所以這通常可能不是一個重要的問題。還有另一個考慮因素是您的范圍實作是否以預期的方式作業。
原因是我不必創建另一種型別
據我所知,您不需要創建另一種型別。您可以使用:
std::ranges::subrange(MyInputIter{ root, pattern }, MySentinel{})
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/453466.html
