假设我有一个MyInputIter满足该概念的输入迭代器类型(我用它来遍历树状结构)std::input_iterator。
我有什么理由不应该在迭代器本身上定义begin()and吗?end()
struct MyInputIter
{
// iterator stuff omitted
auto begin() const { return *this; }
auto end() const { return MySentinel{}; }
};
Run Code Online (Sandbox Code Playgroud)
原因是我不必创建另一种类型来包装begin,end因此我可以在 for 循环中使用它:
MyInputIter iterate(TreeNode root, FilterPattern pattern)
{
return MyInputIter{ root, pattern };
}
void foo()
{
for (auto item : iterate(someRandomTreeNode, "*/*.bla"))
process(item);
}
Run Code Online (Sandbox Code Playgroud)
同时还可以将其用作迭代器:
std::vector<TreeNode> vec(iterate(someRandomTreeNode, "*"), MySentinel{});
Run Code Online (Sandbox Code Playgroud)
\n\n我是否有任何理由不应该在迭代器本身上定义 begin() 和 end() ?
\n
需要考虑的潜在问题:
\nstd::filesystem::directory_iterator,所以这一般来说可能不是一个重大问题。还有另一个考虑因素是您的范围实施是否按预期方式工作。\n\n原因是我不必创建另一种类型
\n
据我所知,您不需要创建另一种类型。您可以使用:
\nstd::ranges::subrange(MyInputIter{ root, pattern }, MySentinel{})\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
243 次 |
| 最近记录: |