CodeWalk

C++20 ranges::view与惰性求值

作者:古法程序员 · 2026-05-30 12:55

请解释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)内完成构造/拷贝/赋值。