O(1) 在 std::ranges::views::iota 中查找/包含

NoS*_*tAl 9 c++ c++20 std-ranges c++23

我知道 iota 可能很复杂(例如无限),因此在一般情况下这不容易完成,但在某些情况下应该可以在 O(1) 中进行查找/包含操作。

例如

int main() {
    auto vals = views::iota(10'000'000'000, 100'000'000'000);
    return ranges::find(vals, 74'656'000'000) != vals.end();
}
Run Code Online (Sandbox Code Playgroud)

“无限”运行(进行线性搜索)

显然检查可以在 O(1) 内完成。

有没有办法用 C++ 来实现这种通用方式(即在其他视图上查找/包含需要线性时间,并且当它检测到 iota 时需要 O(1)),或者我需要手动检测传递给我的函数的视图是什么时候有限iota视图并进行>=front <=back检查?

康桓瑋*_*康桓瑋 8

iota_view总是有序的,因此您可以使用它ranges::binary_search来避免无限线性搜索

int main() {
  auto vals = views::iota(10'000'000'000, 100'000'000'000);
  return ranges::binary_search(vals, 74'656'000'000);
}
Run Code Online (Sandbox Code Playgroud)

演示

  • 赞成,因为它是一个改进,但它仍然是 O(log n),不是吗? (3认同)