上篇文章我们学习了View三大特性之轻量级今天学习第二课迟绑定。如你所知迟绑定又有延迟计算惰性处理等别称。具体是怎样的表现可以先看一下下面这段代码// 迟绑定 #include algorithm #include iostream #include ranges #include vector ​ int square(int x) { std::cout x passes squared equals (x * x) std::endl; return x * x; } ​ void test_std() { std::cout __func__ std::endl; std::vectorint data {1, 2, 3}; std::vectorint ret; std::transform(data.begin(), data.end(), std::back_inserter(ret), square); std::cout after std::transform std::endl; for (auto x : ret) { std::cout x std::endl; } } ​ void test_views() { std::cout __func__ std::endl; std::vectorint data {1, 2, 3}; auto ret std::ranges::views::transform(data, square); std::cout after std::ranges::views::transform std::endl; for (auto x : ret) { std::cout x std::endl; } } ​ int main() { test_std(); test_views(); }输出结果为test_std 1 passes squared equals 1 2 passes squared equals 4 3 passes squared equals 9 after std::transform 1 4 9 test_views after std::ranges::views::transform 1 passes squared equals 1 1 2 passes squared equals 4 4 3 passes squared equals 9 9我们发现在使用传统的 std::transform 会在函数执行时将所有数据进行立即的处理因此当其获得返回值时必然是进行一轮 O(n) 时间复杂度的处理。而使用 views::transform 并获得返回值时一次实际的 square() 都没有发生。直到我们在真正地进行数据处理比如遍历数据时才会一个一个地进行数据处理。这就是上文指的“延迟”计算。这有一个极大的好处比如当有时在循环时进行 break 后后续数据的处理将一次都不会执行。这使得在很多实际应用场景中可以避免很多没必要的计算。