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循环如何在数组上工作,没有begin
和end
成员.它也将寻找免费的功能begin
,并end
通过ADL,并最终std::begin
和std::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节)类型的迭代交易.