当前位置: 首页 > news >正文

【C++11】解锁C++11新纪元:深入探索Lambda表达式的奥秘

📝个人主页🌹:Eternity._
⏩收录专栏⏪:C++ “ 登神长阶 ”
🤡往期回顾🤡:C++11右值引用
🌹🌹期待您的关注 🌹🌹

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

❀C++11

  • 📒1. 可变参数模板
  • 📚2. lambda表达式
    • 🌞lambda表达式
    • 🌙lambda表达式语法
    • ⭐函数对象与lambda表达式
  • 📝3. 包装器
    • 🎩function包装器
    • 🎈bind
  • 📖4. 总结


前言:在C++编程语言的悠久历史中,每一次标准的更新都带来了革命性的变化,推动了编程范式和性能优化的新边界。C++11标准,作为这一漫长演进过程中的一个重要里程碑,不仅巩固了C++作为高性能系统级编程语言的地位,还引入了众多现代编程特性,极大地丰富了C++的表达力和易用性。其中,lambda表达式和std::function无疑是这些新特性中最引人注目且影响深远的两个

Lambda表达式,作为C++11中引入的匿名函数对象,以其简洁的语法和强大的功能,彻底改变了C++中编写回调函数和临时函数的方式。它们允许开发者在需要函数对象的地方直接定义并使用函数逻辑,无需显式定义和命名函数或函数对象类。这不仅简化了代码,提高了可读性,还使得代码更加灵活和易于维护

而与lambda表达式相辅相成的std::function,则是一个通用的函数封装器,它提供了一种类型安全的方式来存储、复制和调用任何可调用对象,包括函数指针、函数对象、lambda表达式以及绑定表达式等。std::function的引入,使得C++的函数式编程风格得以更加流畅地实现,同时也为C++的面向对象编程和泛型编程提供了强大的支持

本篇旨在深入探讨C++11中的lambda表达式和std::function,通过理论讲解、示例演示和实战应用,帮助读者全面理解并掌握这两个重要特性

让我们一起踏上学习的旅程,探索它带来的无尽可能!


📒1. 可变参数模板

可变参数模板是C++11中引入的一种非常有用的语言特性,它允许函数或类模板接受可变数量的参数。这一特性极大地增加了模板的灵活性和扩展性,使得开发者可以定义更加通用和灵活的函数或类模板


C++11的新特性可变参数模板能够让您创建可以接受可变参数的函数模板和类模板,相比C++98/03,类模版和函数模版中只能含固定数量的模版参数,可变模版参数无疑是一个巨大的改进。然而由于可变模版参数比较抽象,使用起来需要一定的技巧,所以这块还是比较晦涩的

可变参数的函数模板:

// Args是一个模板参数包,args是一个函数形参参数包
// 声明一个参数包Args...args,这个参数包中可以包含0到任意个模板参数。
template <class ...Args>
void ShowList(Args... args)
{}

注意:带省略号的参数称为“参数包”,它里面包含了0到N(N>=0)个模版参数


我们无法直接获取参数包args中的每个参数的,只能通过展开参数包的方式来获取参数包中的每个参数,这是使用可变模版参数的一个主要特点,也是最大的难点

递归函数方式展开参数包:

void _ShowList()
{cout << endl;
}template <class T, class ...Args>
void _ShowList(const T& value, Args... args)
{cout << value << " ";_ShowList(args...);
}template <class ...Args>
void ShowList(Args... args)
{_ShowList(args...);
}int main()
{ShowList(1);ShowList(1,2);ShowList(1,2,3);return 0;
}

获取参数包的大小:

void ShowList(Args... args)
{// 这里有些特殊,我们需要将省略号写在sizeof后面cout << sizeof...(args) << endl;
}

📚2. lambda表达式

在C++中,lambda表达式是一种匿名函数对象,它可以捕获其所在作用域中的变量,并可以在需要函数对象的任何地方使用。Lambda表达式通常用于简化函数对象的编写,特别是在使用标准库算法(如std::sort、std::find_if等)时

在C++11之前对一个数据集合中的元素进行排序

std::sort

#include <algorithm>int main()
{int array[] = { 4,1,8,5,3,7,0,9,2,6 };// 默认按照小于比较,排出来结果是升序std::sort(array, array + sizeof(array) / sizeof(array[0]));// 如果需要降序,需要改变元素的比较规则std::sort(array, array + sizeof(array) / sizeof(array[0]), greater<int>());return 0;
}

仿函数

struct Goods
{string _name; // 名字double _price; // 价格int _evaluate; // 评价Goods(const char* str, double price, int evaluate):_name(str), _price(price), _evaluate(evaluate){}
};
struct ComparePriceLess
{bool operator()(const Goods& gl, const Goods& gr){return gl._price < gr._price;}
};
struct ComparePriceGreater
{bool operator()(const Goods& gl, const Goods& gr){return gl._price > gr._price;}
};int main()
{vector<Goods> v = { { "苹果", 2.1, 5 }, { "香蕉", 3, 4 }, { "橙子", 2.2,3 }, { "菠萝", 1.5, 4 } };sort(v.begin(), v.end(), ComparePriceLess());sort(v.begin(), v.end(), ComparePriceGreater());for (size_t i = 0; i < v.size(); i++){cout << v[i]._name << ":" << v[i]._price << ":" << v[i]._evaluate << endl;}
}

随着C++语法的发展,人们开始觉得上面的写法太复杂了,每次为了实现一个algorithm算法,
都要重新去写一个类,如果每次比较的逻辑不一样,还要去实现多个类,特别是相同类的命名,
这些都给编程者带来了极大的不便。因此,在C++11语法中出现了Lambda表达式


🌞lambda表达式

对一个数据集合中的元素进行排序

int main()
{vector<Goods> v = { { "苹果", 2.1, 5 }, { "香蕉", 3, 4 }, { "橙子", 2.2,3 }, { "菠萝", 1.5, 4 } };sort(v.begin(), v.end(), [](const Goods& g1, const Goods& g2) {return g1._price < g2._price; });sort(v.begin(), v.end(), [](const Goods& g1, const Goods& g2) {return g1._price > g2._price; });sort(v.begin(), v.end(), [](const Goods& g1, const Goods& g2) {return g1._evaluate < g2._evaluate; });sort(v.begin(), v.end(), [](const Goods& g1, const Goods& g2) {return g1._evaluate > g2._evaluate; });for (size_t i = 0; i < v.size(); i++){cout << v[i]._name << ":" << v[i]._price << ":" << v[i]._evaluate << endl;}
}

注意:lambda表达式实际是一个匿名函数

int main()
{auto f1 = []() {};cout << typeid(f1).name() << endl;return 0;
}

在这里插入图片描述


🌙lambda表达式语法

lambda表达式书写格式:
[capture-list] (parameters) mutable -> return-type { statement}


表达式各部分说明

部位说明
[capture-list]捕捉列表,该列表总是出现在lambda函数的开始位置,编译器根据[]来判断接下来的代码是否为lambda函数,捕捉列表能够捕捉上下文中的变量供lambda函数使用。
(parameters)参数列表。与普通函数的参数列表一致,如果不需要参数传递,则可以连同()一起省略
mutable默认情况下,lambda函数总是一个const函数,mutable可以取消其常量性。使用该修饰符时,参数列表不可省略(即使参数为空)。
->returntype返回值类型。用追踪返回类型形式声明函数的返回值类型,没有返回值时此部分可省略。返回值类型明确情况下,也可省略,由编译器对返回类型进行推导。
{statement}函数体。在该函数体内,除了可以使用其参数外,还可以使用所有捕获到的变量

注意:在lambda函数定义中,参数列表和返回值类型都是可选部分,而捕捉列表和函数体可以为
空。因此C++11中最简单的lambda函数为:[]{}; 该lambda函数不能做任何事情

int main()
{// 省略了返回值类型,无返回值类型auto f2 = [](int* x, int* y){cout << &x << " " << &y << endl;int tmp = *x;*x = *y;*y = tmp;};
}

捕获列表说明

捕捉列表描述了上下文中那些数据可以被lambda使用,以及使用的方式传值还是传引用

符号意义
[var]表示值传递方式捕捉变量var
[=]表示值传递方式捕获所有父作用域中的变量(包括this)
[&var]表示引用传递捕捉变量var
[&]表示引用传递捕捉所有父作用域中的变量(包括this)
[this]表示值传递方式捕捉当前的this指针
int main()
{int a = 7; int b = 9;// 不加mutable会报错,因为默认情况Lambda是const函数auto f3 = [&a, &b]()mutable{cout << &a << " " << &b << endl;int tmp = a;a = b;b = tmp;};
}

注意:

  • 父作用域指包含lambda函数的语句块
  • 语法上捕捉列表可由多个捕捉项组成,并以逗号分割
    比如:[=, &a, &b]:以引用传递的方式捕捉变量a和b,值传递方式捕捉其他所有变量
    [&,a, this]:值传递方式捕捉变量a和this,引用方式捕捉其他变量
  • 捕捉列表不允许变量重复传递,否则就会导致编译错误
    比如:[=, a]:=已经以值传递方式捕捉了所有变量,捕捉a重复
  • 在块作用域以外的lambda函数捕捉列表必须为空
  • 在块作用域中的lambda函数仅能捕捉父作用域中局部变量,捕捉任何非此作用域或者
    非局部变量都会导致编译报错
  • lambda表达式之间不能相互赋值,即使看起来类型相同

在使用lambda时,其实就是相当于调用了一个函数


⭐函数对象与lambda表达式

函数对象,又称为仿函数,即可以像函数一样使用的对象,就是在类中重载了operator()运算符的类对象

class Pxt
{
public:Pxt(double money) : _money(money){}double operator()(int day){return _money * day;}
private:double _money;
};int main()
{double money = 100;Pxt p1(money);cout << p1(10) << endl;auto p2 = [=](double money, int day)->double {return money * day; };cout << p2(100, 10) << endl;return 0;
}

函数对象将money作为其成员变量,在定义对象时给出初始值即可,lambda表达式通过捕获列表可以直接将该变量捕获到

在这里插入图片描述


📝3. 包装器

🎩function包装器

function包装器 也叫作适配器。C++中的function本质是一个类模板,也是一个包装器

template<class F, class T>
T useF(F f, T x)
{return f(x);
}
double f(double i)
{return 1;
}
struct Functor
{double operator()(double d){return 1;}
};int main()
{// 函数名cout << useF(f, 11.11) << endl;// 函数对象cout << useF(Functor(), 11.11) << endl;// lamber表达式cout << useF([](double d)->double { return d; }, 11.11) << endl;return 0;
}

通过上面的程序验证,我们会发现useF函数模板实例化了三份
包装器可以很好的解决上面的问题

template <class Ret, class... Args>
class function<Ret(Args...)>;
//模板参数说明:
//Ret: 被调用函数的返回类型
//Args…:被调用函数的形参

lambda表达式

function<int(int, int)> func1 = [](const int a, const int b) { return a+b; };

🎈bind

std::bind函数定义在头文件中,是一个函数模板,它就像一个函数包装器(适配器),接受一个可调用对象(callable object),生成一个新的可调用对象来“适应”原对象的参数列表。一般而言,我们用它可以把一个原本接收N个参数的函数fn,通过绑定一些参数,返回一个接收M个(M可以大于N,但这么做没什么意义)参数的新函数。同时,使用std::bind函数还可以实现参数顺序调整等操作

// 原型如下:
template <class Fn, class... Args>
/* unspecified */ bind (Fn&& fn, Args&&... args);
// with return type (2)
template <class Ret, class Fn, class... Args>
/* unspecified */ bind (Fn&& fn, Args&&... args);

示例:

int Plus(int a, int b)
{return a + b;
}
class Sub
{
public:int sub(int a, int b){return a - b;}
};
int main()
{//表示绑定函数plus 参数分别由调用 func1 的第一,二个参数指定function<int(int, int)> func1 = bind(Plus, placeholders::_1,placeholders::_2);//func2的类型为 function<void(int, int, int)> 与func1类型一样//表示绑定函数 plus 的第一,二为: 1, 2auto func2 = bind(Plus, 1, 2);cout << func1(1, 2) << endl;cout << func2() << endl;Sub s;// 绑定成员函数function<int(int, int)> func3 = bind(&Sub::sub, s,placeholders::_1, placeholders::_2);// 参数调换顺序function<int(int, int)> func4 = bind(&Sub::sub, s,placeholders::_2, placeholders::_1);cout << func3(1, 2) << endl;cout << func4(1, 2) << endl;return 0;
}

📖4. 总结

在深入探讨C++11引入的lambda表达式与包装器(也称为闭包)的旅程即将结束时,我们不禁要为这一强大特性的加入而赞叹。Lambda表达式不仅极大地丰富了C++的表达能力,还让编程变得更加灵活、直观和高效。它们如同编程语言中的魔法,允许开发者在需要函数或函数对象的地方,以极其简洁的方式定义并立即使用匿名函数

通过本文的学习,我们见证了lambda表达式如何以其独特的语法糖——[]捕获列表、()参数列表、mutable关键字(可选)、->返回类型(可选)以及函数体{},构建出功能强大的代码块。我们学会了如何利用捕获列表来控制lambda表达式对外部变量的访问权限,包括值捕获、引用捕获以及它们之间的微妙差异。此外,我们还探讨了lambda表达式的类型——std::function和模板参数自动推导(如auto)如何进一步促进了lambda表达式的使用,使得它们可以轻松地与标准库中的算法和其他函数模板协同工作

C++11中的lambda表达式和包装器是C++发展史上的一个重要里程碑。它们不仅为C++语言注入了新的活力,也为广大开发者提供了更加高效、灵活的编程手段。随着C++的不断演进和发展,我们有理由相信,lambda表达式将会在更多的场景中得到应用

在这里插入图片描述

希望本文能够为你提供有益的参考和启示,让我们一起在编程的道路上不断前行!
谢谢大家支持本篇到这里就结束了,祝大家天天开心!

在这里插入图片描述

相关文章:

【C++11】解锁C++11新纪元:深入探索Lambda表达式的奥秘

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ ⏩收录专栏⏪&#xff1a;C “ 登神长阶 ” &#x1f921;往期回顾&#x1f921;&#xff1a;C11右值引用 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀C11 &#x1f4d2;1. 可变参数模板…...

c语言排序(2)

前言 在上一篇文章&#xff0c;我们学习了插入排序&#xff0c;选择排序以及交换排序中的冒泡排序&#xff0c;接下来我们继续学习交换排序、归并排序以及非比较排序。 1. 快速排序 快速排序是交换排序的一种&#xff0c;它的基本思想&#xff1a;任取待排序序列中的某元素作…...

vue3+ts+element plus开源框架基础

Vue 3、TypeScript 和 Element Plus 的结合为现代前端应用开发提供了强大的支持。以下是关于这三者结合的基础介绍&#xff1a; 1. Vue 3 Vue 3 是一个流行的开源JavaScript框架&#xff0c;用于构建用户界面和单页面应用。它带来了许多新特性和改进&#xff0c;包括&#xf…...

RabbitMQ快速入门(MQ的概念、安装RabbitMQ、在 SpringBoot 项目中集成 RabbitMQ )

文章目录 1. 补充知识&#xff1a;同步通讯和异步通讯1.1 同步通讯1.2 异步通讯 2. 同步调用的缺点2.1 业务耦合2.2 性能较差2.3 级联失败 3. 什么情况下使用同步调用4. 异步调用5. 异步调用的优点和缺点5.1 异步调用的优点5.1.1 解除耦合&#xff0c;拓展性强5.1.2 无需等待&a…...

Linux文件与目录管理命令 ls cp rm mv使用方法

Linux文件与目录的管理基本上包括&#xff1a;显示属性、复制、删除、移动文件与目录等&#xff0c;由于文件与目录的管理不仅重要而且操作频繁&#xff0c;所以本文列举一些常用的管理命令。 如需了解路径的概念及目录的基本操作&#xff0c;可参考【Linux】路径的概念及目录的…...

KubeSphere 部署的 Kubernetes 集群使用 GlusterFS 存储实战入门

转载&#xff1a;KubeSphere 部署的 Kubernetes 集群使用 GlusterFS 存储实战入门 知识点 定级&#xff1a;入门级 GlusterFS 和 Heketi 简介 GlusterFS 安装部署 Heketi 安装部署 Kubernetes 命令行对接 GlusterFS 实战服务器配置(架构1:1复刻小规模生产环境&#xff0c;…...

elasticsearch源码分析-08Serch查询流程

Serch查询流程 查询请求Rest路由注册也是在actionModule中 //查询操作 registerHandler.accept(new RestSearchAction());Override public List<Route> routes() {return unmodifiableList(asList(new Route(GET, "/_search"),new Route(POST, "/_searc…...

【协作提效 Go - gin ! swagger】

什么是swagger Swagger 是一个用于设计、构建、记录和使用 RESTful Web 服务的工具集。它的主要作用包括&#xff1a; API 文档生成&#xff1a;Swagger 可以自动生成详细的 API 文档&#xff0c;包括每个端点的请求和响应格式、参数、状态码等。这使得开发者和用户可以轻松理…...

栈和队列——3.滑动窗口最大值

力扣题目链接 给定一个数组 nums&#xff0c;有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。返回滑动窗口中的最大值。 示例&#xff1a; 输入&#xff1a;nums[1,3,-1,-3,5,3,6,7],k 3 …...

嵌入式智能手表开发系列文章之开篇

不好意思&#xff0c;朋友们&#xff0c;我回来了。想想已经断更了好久了。在这段断更的日子里。开拓了个新领域&#xff0c;不搞android 产品&#xff0c;而是去搞嵌入式智能手表啦。 接下来我会用几篇文章来介绍下我对这个领域的看法体会&#xff0c;以及我自己所负责领域的…...

24.8.2数据结构|双链表

双链表 1、定义结构&#xff1a;2个指针域、数据域 2、初始化&#xff1a;创建一个含有N个结点的带头结点双链表head &#xff08;双链表头结点的前驱与和尾节点的后继与置为空&#xff09; 3、求表长&#xff1a;返回双链表head的长度 4、取元素&#xff1a;取出双链表head中…...

RabbitMQ高级特性 - 事务消息

文章目录 RabbitMQ 事务消息概述实现原理代码实现不采用事务采用事务 RabbitMQ 事务消息 概述 RabbitMQ 的 AMQP 协议实现了事务机制&#xff0c;允许开发者保证消息的发送和接收时原子性的&#xff0c;也就是说&#xff0c;要么消息全都发送成功&#xff0c;要么全都发送失败…...

leetcode:心算挑战

题目&#xff1a; 心算项目的挑战比赛中&#xff0c;要求选手从N张卡牌中选出cnt张卡牌&#xff0c;若这cnt张卡牌数字总和为偶数&#xff0c;则选手成绩「有效」且得分为cnt张卡牌数字总和。给定数组cards和cnt&#xff0c;其中cards[i]表示第i张卡牌上的数字。 请帮参赛选手计…...

docker部署java项目(war包方式)

场景描述:java项目war包,在开发开电脑上使用dockerfile构建镜像,上传镜像到客户服务器中使用docker加载docker镜像,然后部署。 目录 一、本地环境安装 docker git 二、服务器环境安装 docker 三、构建docker镜像(win系统) 四、注意事项 (1)系统架构 (2)使…...

jsp 自定义taglib

一、简介 我们在javaWeb开发中&#xff0c;经常会用到jsp的taglib标签&#xff0c;有时候并不能满足我们的实际需要&#xff0c;这就需要我们自定义taglib标签&#xff0c; 二、开发步骤 1、编写control方法&#xff0c;继承BodyTagSupport 2、定义zdytaglib.tld标签文件 3、…...

从一到无穷大 #32 TimeCloth,云上的快速 Point-in-Time Recovery

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。 本作品 (李兆龙 博文, 由 李兆龙 创作)&#xff0c;由 李兆龙 确认&#xff0c;转载请注明版权。 文章目录 引言解决方案FAST FINE-GRAINED PITRLog FilterInter-Record Dependency ResolutionL…...

时间序列论文1——Forecasting at Scale

目录 0. AI总结0.1 文章概述0.2 研究背景0.3 研究思路0.4 研究结论与讨论1. Introduction2 Features of Business Time Series3 The Prophet Forecasting Model3.1 The Trend Model3.2 Seasonality3.3 Holidays and Events3.4 Model Fitting3.5 Analyst-in-the-Loop Modeling4 …...

HDFS常用命令

HDFS常用命令 1.HDFS命令介绍1.1基本语法格式1.2常用命令 1.HDFS命令介绍 HDFS 提供了一组命令行工具&#xff0c;用于管理和操作 HDFS 文件系统。 1.1基本语法格式 hdfs dfs -<命令> [选项] <参数>1.2常用命令 1.显示<path>指定的文件的详细信息。 had…...

请问如何做好软件测试工作呢?

一、明确测试目标和范围 理解测试目的&#xff1a;在开始测试之前&#xff0c;首先要明确测试的目标和范围&#xff0c;确保测试计划 与需求相匹配。这有助于测试人员聚焦在关键功能上&#xff0c;避免浪费时间和资源。制定详细的测试计划&#xff1a;根据项目需求&#xff0…...

单片机开发与Linux开发的区别

引言 单片机&#xff08;MCU&#xff09;和Linux开发是嵌入式系统领域的两大主要方向。它们在硬件平台、开发环境、应用场景和开发难度上存在显著区别。本文将系统性地比较单片机开发和Linux开发&#xff0c;探讨它们的主要区别及各自的应用场景和难度体系。 一、基本概念 1…...

【机器学习】回归类算法-相关性分析

一、前言 前面的几篇博客我们学习了分类算法&#xff0c;今天我们来了解一下回归类的算法吧。首先我们来谈谈两者有什么区别&#xff0c;首先是我们在之前的分类算法&#xff0c;这类算法可以将让我们学会如何将不同的数据划分到不同的类里面&#xff0c;输出的是一些离散的值。…...

java基础 之 集合与栈的使用(三)

文章目录 Map接口&#xff08;一&#xff09;实现类&#xff1a;HashMap特点HashMap集合的一些方法 &#xff08;二&#xff09;实现类&#xff1a; TreeMap特点【自然排序】代码【定制排序】代码TreeMap集合的一些方法 HashMap 和 TreeMap的区别 前文回顾&#xff1a; 戳这里 …...

JDK-java.nio包详解

JDK-java.nio包详解 概述 一直以来Java三件套&#xff08;集合、io、多线程&#xff09;都是最热门的Java基础技术点&#xff0c;我们要深入掌握好这三件套才能在日常开发中得心应手&#xff0c;之前有编写集合相关的文章&#xff0c;这里出一篇文章来梳理一下io相关的知识点。…...

虚拟机与服务器的区别是什么?虚拟机与服务器的区别和联系

服务器和虚拟机是两个不同的概念&#xff0c;它们在计算机领域有着不同的含义和作用。今天飞飞就和你分享虚拟机和服务器的区别和联系&#xff0c;希望可以帮助到你~ 1、物理形态 a)服务器是实实在在的物理设备&#xff0c;拥有独立的硬件架构。如CPU、硬盘、内存等 b)虚拟机…...

Linux CentOS stream9 命令

初学linux,对字符界面的命令并不陌生。问到什么是linux命令直接答cd、pwd、ls是linux命令。对于命令的定义并熟悉,也不太关心命令的底层执行逻辑,更关心录入命令,马上获取需要的结果。 本文就命令的定义、分类或执行优先级作一简单介绍。 一、定义 搜索网上对linux命令的…...

JavaScript基础——JavaScript变量声明

变量是存储数据的容器&#xff0c;可以变的量&#xff0c;值可以改变&#xff0c;在JavaScript中&#xff0c;变量声明的关键字有var、let&#xff0c;其中&#xff0c;var是ES5的语法&#xff0c;let是ES6的语法&#xff0c;变量需要先声明&#xff0c;在使用。 声明一个age变…...

ModuleNotFoundError: No Module Named openai

题意&#xff1a;Python 无法在环境中找到名为 openai 的模块 问题背景&#xff1a; import requests from bs4 import BeautifulSoup import openai #write each line of nuclear.txt to a list with open(nuclear.txt, r) as f:lines f.readlines()#remove the newline cha…...

基于SpringBoot+Vue的校园便利平台(带1w+文档)

基于SpringBootVue的校园便利平台(带1w文档) 基于SpringBootVue的校园便利平台(带1w文档) 本平台采用B/S架构、采用的数据库是MySQL&#xff0c;使用JAVA技术开发。该平台的开发方式无论在国内还是国外都比较常见&#xff0c;而且开发完成后使用普遍&#xff0c;可以给平台用户…...

串口应用编程-I.MX6U嵌入式Linux C应用编程学习笔记基于正点原子阿尔法开发板

串口应用编程 串口应用编程介绍 介绍 串口定义:串行接口,数据按顺序传输 串口特点:通信线路简单,距离远,速度较低 应用领域:常用工业接口 Linux系统中的作用 作为标准输入输出设备 系统打印信息输出 用户与系统交互 串口与终端:在Linux系统中,串口被视为一种终端&#…...

Canvas实现截图

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>canvas实现截图功能</title><style>.ca…...

wordpress 导入docx/怎么做蛋糕

本文是我安装ORACLE11g后客户端IE访问不了是出现的&#xff0c;无奈下找OTN上help&#xff0c;结果很lucky的被解脱了。我翻译翻译一下&#xff0c;若有错误&#xff0c;欢迎纠正(一)出现问题Certificate Error: Navigation Blocked------------证书错误 , 导航阻止此时证书既没…...

怎么封闭网站/网页搜索排名提升

文章目录Ubuntu 终端美化&#xff08;oh-my-zsh&#xff09;一、 环境准备二、 配置文件1、 主题2、 修改插件2.1 官方插件2.2 第三方插件Ubuntu 终端美化&#xff08;oh-my-zsh&#xff09; 一、 环境准备 这个美化教程适合于大多数的 Linux 系统&#xff0c;其实可以通用的。…...

廊坊高端品牌网站建设/公众号推广方案

菜单可能是Windows程序提供的一致的用户界面中最重要的部分&#xff0c;而想程序中添加菜单是Windows编程中相对容易的布冯。当用户选择菜单单选时&#xff0c;Windows向你的程序发送了一个含有才菜单单选ID的WM_COMMAND消息 LOWORD(wParam)控件&#xff29;&#xff24;HIWORD…...

沧州网站建设价格/北京网站制作

人生苦短&#xff0c;我用 Python 前文传送门&#xff1a; 小白学 Python 数据分析&#xff08;1&#xff09;&#xff1a;数据分析基础 小白学 Python 数据分析&#xff08;2&#xff09;&#xff1a;Pandas &#xff08;一&#xff09;概述 小白学 Python 数据分析&#x…...

在腾讯云怎样建设网站/小红书seo是什么意思

给你两个整数数组 nums1 和 nums2 &#xff0c;请你以数组形式返回两数组的交集。返回结果中每个元素出现的次数&#xff0c;应与元素在两个数组中都出现的次数一致&#xff08;如果出现次数不一致&#xff0c;则考虑取较小值&#xff09;。可以不考虑输出结果的顺序。 示例 1…...

暂时没有域名怎么做网站/seo在线工具

vivado IP核封装的时候出现的错误 &#xff1a;bus interface “rstn” does not contain any port map. 解决办法&#xff1a; 右键rstn信号&#xff0c;选择Edit Interface&#xff0c;选择Port Mapping&#xff0c;选中下图左边的信号RST&#xff0c;选择右边右边的rstn&am…...