lambda源自希腊字母表中第11位的λ,在计算机科学领域,它则被用来表示一种匿名函数。所谓匿名函数,简单地理解就是没有名称的函数,又常被称为lambda函数或者lambda表达式。 1.lambda匿名函数的定义 [capture](parameters)mutable->return-type{statement} 参数说明: [capture]:捕捉列表,[]是lambda引出符,编译器根据该引出符判断接下来的代码是否是lambda函数。捕捉列表用于捕捉父域中的变量以供lambda函数使用,捕捉列表可以由多个项组成,用","分割。[var]表示以值传递方式捕捉父域中的变量v...

  LoeQspFvaEjW   2023年11月02日   42   0   0 C++

返回值类型后置语法,是为了解决函数返回值类型依赖于参数而导致难以确定返回值类型的问题。有了这种语法以后,对返回值类型的推导就可以用清晰的方式(直接通过参数做运算)描述出来,而不需要像C98/03那样使用晦涩难懂的写法。 在泛型编程中,可能需要通过参数的运算来得到返回值的类型。比如如下的代码: template<typenameR,typenameT,typenameU> Radd(Tt,Uu) { returnt+u; } inta=1;floatb=2.0; autoc=add<decltype(a+b)>(a,b); 我们并不关心a+b的类型是什么,因此,只需...

  LoeQspFvaEjW   2023年11月02日   104   0   0 C++

在C98/03标准中,类模板可以有默认的模板参数,如下: template<typenameT,typenameU=int,UN=0> structFoo { //... }; 但是却不支持函数的默认模板参数: template<typenameT=int>//errorinC98/03:defaulttemplatearguments voidfunc() { //... } 现在这一限制在C11中被解除了。上面的func函数在C11中可以直接使用,代码如下: intmain(void) { func();//T=int return0; } 此时模板参数T的...

  LoeQspFvaEjW   2023年11月02日   69   0   0 C++

C11标准新引入了一种类模板,命名为tuple(元组)。tuple最大的特点是:实例化的对象可以存储任意数量、任意类型的数据。 tuple的应用场景很广泛,例如当需要存储多个不同类型的元素时,可以使用tuple;当函数需要返回多个数据时,可以将这些数据存储在tuple中,函数只需返回一个tuple对象即可。 1.tuple对象的创建 tuple本质是一个以可变模板参数定义的类模板,它定义在 头文件并位于std命名空间中。因此要想使用tuple类模板,程序中需要首先引入以下代码: include<tuple> usingstd::tuple; 实例化tuple模板类对象常用...

  LoeQspFvaEjW   2023年11月02日   61   0   0 C++

在C98/03中,对象初始化方法有很多种,如下代码所示: //初始化列表 inti_arr[3]={1,2,3};//普通数组 structA { intx; structB { inti; intj; }b; }a={1,{2,3}};//POD类型 //拷贝初始化(copy-initialization) inti=0; classFoo { public: Foo(int){} }foo=123;//需要拷贝构造函数 //直接初始化(direct-initialization) intj(0); Foobar(123); 这些不同的初始化方法,都有各自的适用范围和作用。最关键的是,...

  LoeQspFvaEjW   2023年11月02日   91   0   0 C++

在C/C中,联合体(Union)是一种构造数据类型。在一个联合体内,我们可以定义多个不同类型的成员,这些成员将会共享同一块内存空间。老版本的C为了和C语言保持兼容,对联合体的数据成员的类型进行了很大程度的限制,这些限制在今天看来并没有必要,因此C11取消了这些限制。 C11标准规定,任何非引用类型都可以成为联合体的数据成员,这种联合体也被称为非受限联合体。例如: classStudent{ public: Student(boolg,inta):gender(g),age(a){} private: boolgender; intage; }; unionT{ Students;//含有...

  LoeQspFvaEjW   2023年11月02日   80   0   0 C++

1.C98/03标准的for循环 在C98/03标准中,如果要用for循环语句遍历一个数组或者容器,只能套用如下结构: for(表达式1;表达式2;表达式3){ //循环体 } 例如,下面程序演示了用上述结构遍历数组和容器的具体实现过程: include<iostream> include<vector> include<string.h> usingnamespacestd; intmain(){ chararc[]="http://c.biancheng.net/cplus/11/"; inti; //for循环遍历普通数组 for(i=0;i&...

  LoeQspFvaEjW   2023年11月02日   47   0   0 C++

1.C常量表达式 constexpr是C11标准新引入的关键字,在学习其具体用法和功能之前,我们需要先搞清楚C常量表达式的含义。 所谓常量表达式,指的就是由多个(≥1)常量组成的表达式。换句话说,如果表达式中的成员都是常量,那么该表达式就是一个常量表达式。这也意味着,常量表达式一旦确定,其值将无法修改。 实际开发中,我们经常会用到常量表达式。以定义数组为例,数组的长度就必须是一个常量表达式: //1) inturl[10];//正确 //2) inturl[6+4];//正确 //3) intlength=6; inturl[length];//错误,length是变量 上述代码演示了3种...

  LoeQspFvaEjW   2023年11月02日   96   0   0 C++

本文介绍C11标准中新添加的longlong超长整型和nullptr初始化空指针。 1.C11:longlong超长整型 C11标准中,基于整数大小的考虑,共提供了如下表所示的这些数据类型。与此同时,标准中还明确限定了各个数据类型最少占用的位数。 整数类型 等价类型 C11标准规定占用最少位数 short shortint(有符号短整型) 至少16位(2个字节) signedshort shortint(有符号短整型) 至少16位(2个字节) signedshortint shortint(有符号短整型) 至少16位(2个字节) unsignedshort unsi...

  LoeQspFvaEjW   2023年11月02日   48   0   0 C++

C中有左值和右值的概念。其实,左值和右值的区分也同样适用于类对象,本文中将左值的类对象称为左值对象,将右值的类对象称为右值对象。 1.C11:引用限定符 默认情况下,对于类中用public修饰的成员函数,既可以被左值对象调用,也可以被右值对象调用。举个例子: include<iostream> usingnamespacestd; classdemo{ public: demo(intnum):num(num){} intget_num(){ returnthis->num; } private: intnum; }; intmain(){ demoa(10); co...

  LoeQspFvaEjW   2023年11月02日   98   0   0 C++

1.拷贝和拷贝构造函数 拷贝和复制是一个意思,对应的英文单词都是copy。对于计算机来说,拷贝是指用一份原有的、已经存在的数据创建出一份新的数据,最终的结果是多了一份相同的数据。例如,将Word文档拷贝到U盘去复印店打印,将D盘的图片拷贝到桌面以方便浏览,将重要的文件上传到百度网盘以防止丢失等,都是「创建一份新数据」的意思。 在C中,拷贝并没有脱离它本来的含义,只是将这个含义进行了“特化”,是指用已经存在的对象创建出一个新的对象。从本质上讲,对象也是一份数据,因为它会占用内存。严格来说,对象的创建包括两个阶段,首先要分配内存空间,然后再进行初始化: 分配内存很好理解,就是在堆区、栈区或者全...

  LoeQspFvaEjW   2023年11月02日   101   0   0 C++

1.拷贝构造函数中的深拷贝问题 在C98/03标准中,如果想用其它对象初始化一个同类的新对象,只能借助类中的拷贝构造函数。拷贝构造函数的实现原理很简单,就是为新对象复制一份和其它对象一模一样的数据。需要注意的是,当类中拥有指针类型的成员变量时,拷贝构造函数中需要以深拷贝(而非浅拷贝)的方式复制该指针成员。 举个例子: include<iostream> usingnamespacestd; classdemo{ public: demo():num(newint(0)){ cout<<"construct!"<<endl; } //拷贝构造函数 dem...

  LoeQspFvaEjW   2023年11月02日   114   0   0 C++

通过学习C11移动构造函数我们知道,C11标准中借助右值引用可以为指定类添加移动构造函数,这样当使用该类的右值对象(可以理解为临时对象)初始化同类对象时,编译器会优先选择移动构造函数。 需要注意,移动构造函数的调用时机是:用同类的右值对象初始化新对象。那么,用当前类的左值对象(有名称,能获取其存储地址的实例对象)初始化同类对象时,是否就无法调用移动构造函数了呢?当然不是,C11标准中已经给出了解决方案,即调用move()函数。 move本意为"移动",但该函数并不能移动任何数据,它的功能很简单,就是将某个左值强制转化为右值。基于move()函数特殊的功能,其常用于实现移动语义。 move(...

  LoeQspFvaEjW   2023年11月02日   97   0   0 C++

1.什么是浅拷贝和深拷贝 对于基本类型的数据以及简单的对象,它们之间的拷贝非常简单,就是按位复制内存。例如: classBase{ public: Base():m_a(0),m_b(0){} Base(inta,intb):m_a(a),m_b(b){} private: intm_a; intm_b; }; intmain(){ inta=10; intb=a;//拷贝 Baseobj1(10,20); Baseobj2=obj1;//拷贝 return0; } b和obj2都是以拷贝的方式初始化的,具体来说,就是将a和obj1所在内存中的数据按照二进制位(Bit)复制到b和obj2...

  LoeQspFvaEjW   2023年11月02日   85   0   0 C++

C中的explicit关键字只能用于修饰只有一个参数的类构造函数,它的作用是表明该构造函数是显示的,而非隐式的,跟它相对应的另一个关键字是implicit,意思是隐藏的,类构造函数默认情况下即声明为implicit(隐式)。 那么显示声明的构造函数和隐式声明的有什么区别呢?来看下面的例子: classCxString//没有使用explicit关键字的类声明,即默认为隐式声明 { public: char_pstr; int_size; CxString(intsize) { _size=size;//string的预设大小 _pstr=malloc(size+1);//分配string的内...

  LoeQspFvaEjW   2023年11月02日   74   0   0 C++

1.KVM简介 Kernel-basedVirtualMachine的简称,是一个开源的系统虚拟化模块,自Linux2.6.20之后集成在Linux的各个主要发行版本中。它使用Linux自身的调度器进行管理,所以相对于Xen,其核心源码很少。KVM目前已成为学术界的主流VMM之一。 2.安装前提 Kvm的安装,需要一定的硬件和软件支持:​1.需要宿主机CPU支持完全虚拟化(如IntelVT技术或者AMDV技术)。​2.宿主机系统为64位的Linux系统且内核版本高于2.6.20,内核版本过低,需要进行升级。 查看CPU是否支持完全虚拟化,在宿主机输入: egrep'vmx|svm'/...

  LoeQspFvaEjW   2023年11月01日   116   0   0 软件工程其他

1.Virsh简介 virsh是用来管理客户端及其管理程序的命令行界面工具。 virsh工具是构建在libvirt管理API上,可作为xm命令和图形客户端管理程序(virt-manager)的替代工具。非特权用户只能以只读模式使用virsh。您可使用virsh为客户端机器执行脚本。 2.使用前提 安装虚拟化相关组件安装qemu-kvm(用户态管理工具)安装libvirt(命令行管理工具)安装virt-install(安装kvm工具)安装bridge-utils(桥接设备管理工具) yuminstall-yqemu-kvmlibvirtvirt-installbridge-util...

  LoeQspFvaEjW   2023年11月01日   101   0   0 软件工程其他

Docker简介 Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器或Windows机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。 一个完整的Docker由四个部分组成:DockerClient(客户端)、DockerDaemon(守护进程)、DockerImage(镜像)和DockerContainer(容器)。 Docker使用客户端-服务器(C/S)架构模式,使用远程API来管理和创建Docker容器。Docker容器通过Docker镜像来创建。容器与镜像的关系类似于面向对象编程...

  LoeQspFvaEjW   2023年11月01日   37   0   0 软件工程其他

21.合并两个有序链表(MergeTwoSortedLists) 将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例1: 输入:l1=[1,2,4],l2=[1,3,4] 输出:[1,1,2,3,4,4] 示例2: 输入:l1=[],l2=[] 输出:[] 示例3: 输入:l1=[],l2=[0] 输出:[0] 提示: 两个链表的节点数目范围是[0,50] -100<=Node.val<=100 l1和l2均按非递减顺序排列 方法1:递归 思路与算法 我们可以如下递归地定义两个链表里的merge操作(忽略边界情况,比如空...

  LoeQspFvaEjW   2023年11月01日   102   0   0 算法与数据结构

1.什么是堆、大顶堆和小顶堆 堆是一种非线性结构,可以把堆看作一棵二叉树,也可以看作一个数组,即:堆就是利用完全二叉树的结构来维护的一维数组。 堆可以分为大顶堆和小顶堆:大顶堆:每个结点的值都大于或等于其左右孩子结点的值。小顶堆:每个结点的值都小于或等于其左右孩子结点的值。用简单的公式来描述一下堆的定义就是: 大顶堆:arr[i]>=arr[2i+1]&&arr[i]>=arr[2i+2] 小顶堆:arr[i]<=arr[2i+1]&&arr[i]<=arr[2i+2] 如果是排序,求升序用大顶堆,求降序用小顶堆。一般我们说topK问...

  LoeQspFvaEjW   2023年11月01日   63   0   0 算法与数据结构
关注 更多

空空如也 ~ ~

粉丝 更多

空空如也 ~ ~