我正在创建一个生成大量数据的 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
, end
and operator++
,我能有想要的行为吗?而且,这些方法应该做什么?我的意思是,我可以让他们变得懒惰而不破坏东西吗?
几乎;如果找不到,编译器将在其他几个地方查找以获取开始和结束迭代器begin
or end
容器类的方法;这就是基于范围的 for 循环在数组上工作的方式,没有begin
and end
成员。它还会寻找免费函数begin
and end
通过 ADL,最终std::begin
and std::end
,因此有很多机会改造现有容器的基于范围的 for 循环支持。第 6.5.4 节 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/n4659.pdf涵盖细节。
对于你的另一个问题,迭代器绝对可以是懒惰的!一个很好的例子是std::istream_iterator
which has当它从控制台读取输入时变得懒惰。
在 a 中使用迭代器的要求for
循环是它应该满足输入迭代器类别,描述于第24.2.3节 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/n4659.pdf;该类别所需的操作是!=
, unary *
,以及预增量和后增量++
.
为了让语言知道您已经创建了一个输入迭代器,您应该继承自std::iterator<std::input_iterator_tag, T, void, T *, T &>
where T
是你的迭代器处理的类型(第24.4.3节 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/n4659.pdf).
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)