我怎么能做自己的懒惰迭代器?

Fab*_*ien 10 c++ iterator lazy-evaluation c++11

我正在制作一个产生大量数据的C++ 11类.该数据目前来自数据库,并不能完全适合内存.我想为用户提供一个迭代器,其行为类似于常规的STL迭代器,但这将是懒惰的.更准确地说,我可以做类似的事情:

for (auto& item : big_bunch_of_data) {
    do_stuff_with(item);
}
Run Code Online (Sandbox Code Playgroud)

仅在每次迭代时从数据库中检索项目.如果我是对的,这个新语法就是糖

for (stuff::iterator it = big_bunch_of_data.begin();it != big_bunch_of_data.end();it++) {
    do_stuff_with(*it);
}
Run Code Online (Sandbox Code Playgroud)

这是否意味着通过提供begin,end并且operator++,我可以有所期望的行为?而且,这些方法应该做什么?我的意思是,我可以让他们懒惰而不破坏东西吗?

eca*_*mur 12

几乎; 如果无法在容器类中找到begin或使用end方法,编译器将查看其他几个地方以获取开始和结束迭代器; 这就是基于范围的for循环如何在数组上工作,没有beginend成员.它也将寻找免费的功能begin,并end通过ADL,并最终std::beginstd::end,所以有大量的机会去为改造现有容器循环支持基于范围的的.第6.5.4节涵盖了细节.

对于你的其他问题,迭代器绝对可以是懒惰的!一个很好的例子是std::istream_iterator,其具有要懒惰,因为它从控制台读取输入.

for循环中使用迭代器的要求是它应该满足输入迭代器类别,如第24.2.3节所述; 该类别所需的操作是!=,一元*,前后增量++.

为了让语言知道你已经创建了一个输入迭代器,你应该继承std::iterator<std::input_iterator_tag, T, void, T *, T &>哪里T是在(第24.4.3节)类型的迭代交易.

  • 实际上,没有.它直接使用`.begin()`成员函数.如果没有找到这样的成员,它通过ADL使用`begin`,不一定是'std :: begin`. (3认同)