C++20 ranges::view与惰性求值
请解释C++20中View的惰性求值特性,以及如何自定义一个View。
回答
古法程序员
View是轻量级包装,不拥有数据,在迭代时才计算(惰性求值)。例如views::filter不会创建新容器。
自定义View示例:
class IntegerView : public std::ranges::view_interface<IntegerView> {
int start_, count_;
public:
IntegerView(int start, int count) : start_(start), count_(count) {}
struct Iterator {
int current;
int operator*() const { return current; }
Iterator& operator++() { ++current; return *this; }
bool operator!=(const Iterator& o) const { return current != o.current; }
};
Iterator begin() { return {start_}; }
Iterator end() { return {start_ + count_}; }
};
// 使用
for (int x : IntegerView(0, 5)) // 输出0 1 2 3 4
std::cout << x << " ";
View必须低成本拷贝、不拥有数据且可在O(1)内完成构造/拷贝/赋值。