View的三大特性之一:迟绑定

上篇文章我们学习了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::vector<int> data = {1, 2, 3};
    std::vector<int> 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::vector<int> 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 后,后续数据的处理将一次都不会执行。这使得在很多实际应用场景中可以避免很多没必要的计算。

相关推荐
yuanpan15 小时前
Python 桌面 GUI 入门开发:从 tkinter 窗口到简易记事本
开发语言·python
User_芊芊君子16 小时前
聊聊自由开发者常用的学习机会全解析
开发语言·人工智能·python
AI人工智能+电脑小能手16 小时前
【大白话说Java面试题】【Java基础篇】第40题:Java中的深拷贝和浅拷贝有什么区别
java·开发语言·后端·面试
xh didida17 小时前
算法 -- 位运算
开发语言·c++·算法
hele_two17 小时前
VS Code + CMake 调用 SDL2 & SDL2_image 完整编译教程(Windows 平台)
c++·windows·vscode·图形渲染
谙弆悕博士17 小时前
快速学C语言——第2章:编程规范与代码风格
服务器·c语言·开发语言·经验分享·程序人生·学习方法·业界资讯
byzh_rc17 小时前
[AI编程从入门到入土] 装饰器decorator
开发语言·python·ai编程
祁_z17 小时前
大模型轻量化:模型格式选型(ONNX/GGUF/TFLite) + 压缩三剑客(量化/剪枝/蒸馏)+ 大模型推理执行流程介绍
算法·机器学习·剪枝·量化·蒸馏·大模型轻量化
贫民窟的勇敢爷们17 小时前
Java 与 Python 如何选型与融合
java·开发语言·python
流氓也是种气质 _Cookie17 小时前
Chrome Performance常见名词解释(FP, FCP, LCP, DCL, FMP, TTI, TBT, FID, CLS)
开发语言·javascript·ecmascript