Включает ли стандартная библиотека C++ какой-либо механизм для создания итерируемого диапазона, подобного списку, который использует встроенную функцию генератора для возврата значения в каждой позиции? то есть что-то, что могло бы дать поведение, аналогичное yield return
C# или yield
списков F#? Идеалом было бы:
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);
Я мог бы написать свой собственный итератор, но это кажется большой работой по сравнению с простой передачей простой лямбды в конструктор. И, конечно же, я мог бы сам написать бинарный поиск (но что в этом интересного?). Это единственные варианты?
Для потомков, вот пара ссылок, которые я нашел по этому вопросу:
Эквивалентный шаблон генератора C++ для Python
http://www.sirver.net/blog/2011/08/19/generators-in-c++/
Но, кажется, ответ заключается в том, что нет более простого способа сделать это, чем просто написать бинарный поиск.