11

我正在制作一个产生大量数据的 C++11 类。该数据当前来自数据库,无法完全放入内存。我想为用户提供一个行为类似于常规 STL 迭代器的迭代器,但这会很懒惰。更准确地说,我可以做这样的事情:

for (auto& item : big_bunch_of_data) {
    do_stuff_with(item);
}

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

for (stuff::iterator it = big_bunch_of_data.begin();it != big_bunch_of_data.end();it++) {
    do_stuff_with(*it);
}

这是否意味着通过提供和begin,我可以获得所需的行为?而且,这些方法应该做什么?我的意思是,我可以在不破坏东西的情况下让他们变得懒惰吗?endoperator++

4

1 回答 1

12

几乎; 如果找不到容器类上的方法,begin编译器将在其他几个地方查找开始和结束迭代器;end这就是基于范围的 for 循环在没有beginandend成员的数组上的工作方式。它还将通过 ADL寻找免费的函数begin和,并最终寻找和,因此有很多机会来改进现有容器的基于范围的 for 循环支持。 第 6.5.4 节涵盖了细节。endstd::beginstd::end

对于您的其他问题,迭代器绝对可以是懒惰的!一个很好的例子是std::istream_iterator从控制台读取输入时必须是惰性的。

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

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

于 2012-06-27T08:56:21.393 回答