【发布时间】:2014-06-23 03:49:40
【问题描述】:
C++ 标准库是否包含任何机制来生成类似列表的可迭代范围,该范围使用注入的生成器函数返回每个位置的值?即可以产生类似于 C# 的 yield return 或 F# 的 yield 列表理解的行为?理想的情况是:
hypothetical_generator_list<size_t> l([](size_t index) { return index * 2; });
assert(l[4] == 8);
assert(*(l.begin() + 1000000000) == 2000000000);
动机:我想对包含数千亿(单调递增)值的空间进行二分搜索。但是std::lower_bound 需要迭代器,并且完全不可能将所有值放入像vector 这样的任何东西中。但是,我可以很容易地编写一个函数,给定一个索引,执行一些计算并返回该索引处的值。
hypothetical_generator_list<size_t> c([](size_t index) { return index * 2; });
auto itFound = std::lower_bound(l.begin(), l.begin() + 100000000000, 6000);
assert(itFound - l.begin() == 3000);
我可以编写自己的自定义迭代器,但与仅将简单的 lambda 传递给构造函数相比,这似乎需要大量工作。当然,我也可以自己编写二进制搜索(但这有什么好玩的呢?)。这些是唯一的选择吗?
为了后代,这里有几个我在这个主题上找到的链接:
Equivalent C++ to Python generator pattern
http://www.sirver.net/blog/2011/08/19/generators-in-c++/
但似乎答案是没有比编写二进制搜索更简单的方法了。
【问题讨论】:
-
这并不让我觉得应该使用 容器。更像是一个数学或逻辑过程。
-
@John 你是对的。我试图在函数的输出空间上获取迭代器,以便我可以利用标准库算法来搜索它。我将编辑“容器”这个词。
标签: c++ iterator c++-standard-library