C++ 11 【可变参数模板】【lambda】
💓博主CSDN主页:麻辣韭菜💓
⏩专栏分类:C++修炼之路⏪
🚚代码仓库:C++高阶🚚
🌹关注我🫵带你学习更多C++知识
🔝🔝
目录
前言
一、新的类功能
1.1默认成员函数——移动构造、移动赋值
1.2强制生成默认函数的关键字default:
1.3const延长生命周期的问题
1.4禁止生成默认函数的关键字delete:
1.5 其他新功能
缺省值
委托构造
二、可变参数模板
利用递归函数展开
逗号表达式展开参数包
三、Lambda
lambda表达式
lambda表达式语法
1.捕捉列表
函数对象与lambda表达式
前言
上篇重点讲解了右值引用,本篇的可变参数模板和Lambda也是11里面非常有用的。如果学会这两个以后编程会感觉非常的爽。废话不多说直接开始!!!
一、新的类功能
1.1默认成员函数——移动构造、移动赋值
在C++11后,类又新增了两个默认成员函数:移动构造和移动赋值。
- 如果你没有自己实现移动构造函数,且没有实现析构函数 、拷贝构造、拷贝赋值重载中的任 意一个。那么编译器会自动生成一个默认移动构造。默认生成的移动构造函数,对于内置类 型成员会执行逐成员按字节拷贝,自定义类型成员,则需要看这个成员是否实现移动构造, 如果实现了就调用移动构造,没有实现就调用拷贝构造。
- 如果你没有自己实现移动赋值重载函数,且没有实现析构函数 、拷贝构造、拷贝赋值重载中 的任意一个,那么编译器会自动生成一个默认移动赋值。默认生成的移动构造函数,对于内 置类型成员会执行逐成员按字节拷贝,自定义类型成员,则需要看这个成员是否实现移动赋 值,如果实现了就调用移动赋值,没有实现就调用拷贝赋值。(默认移动赋值跟上面移动构造 完全类似)
- 如果你提供了移动构造或者移动赋值,编译器不会自动提供拷贝构造和拷贝赋值。
#include "String.h"class Person
{
public:Person(const char* name = "", int age = 0):_name(name), _age(age){}/*Person(const Person& p):_name(p._name),_age(p._age){}*//*Person& operator=(const Person& p){if(this != &p){_name = p._name;_age = p._age;}return *this;}*//*~Person(){}*/private:gx::string _name;int _age;
};
int main()
{Person s1;Person s2 = s1;Person s3 = move(s1);Person s4;s4 = move(s2);return 0;
}
如果把上面代码的拷贝构造 赋值重载、析构的任意一个代码注释取消注释就会得到下面结果
为什么我们一但自己写了默认成员函数编译器就不会自己生成移动构造、赋值?
如果我们实现了 析构、拷贝构造、赋值重载,就证明当前的类中涉及到了 动态内存管理,是需要自己进行 深拷贝 的,编译器无能为力,移动语义 也应该根据自己的实际场景进行设计,所以编译器就没有自动生成
那如果有些场景就需要我们自己写拷贝构造、析构、赋值重载这些函数那怎么办?
1.2强制生成默认函数的关键字default:
Person(Person&& p) = default;
Person& operator=(Person&& p) = default;
C++11后STL中所有容器都增加了移动构造和移动赋值
插入系列的函数也同样增加了右值的版本。
其他容器详情请看官网cplusplus.com
1.3const延长生命周期的问题
插入函数之所以会延长生命周期
当您创建一个临时对象并将其作为参数传递给函数时,这个临时对象的生命周期通常只在表达式中有效。一旦表达式结束,临时对象就会被销毁。但是,如果这个临时对象被传递给一个需要更长时间使用它的函数,比如一个需要对对象进行修改的函数,那么就需要延长这个临时对象的生命周期。
在C++中,如果一个函数的参数是一个const
类型,这意味着函数不会修改这个对象。但是,如果这个参数是通过引用传递的,那么即使它是const
,它仍然需要在函数调用期间保持有效,以便函数可以访问它。这就是所谓的生命周期延长。
既然可以延长对象生命周期那是不是也可以像这样?下图这样返回的对象加const
从结果来看显然是不可以的。出现了野引用的问题。 所以说引用也不是安全的。
1.4禁止生成默认函数的关键字delete:
在person类中我们在拷贝构造函数后面加 =delete 就无法再使用这个这个函数。
注意:delete这个关键字只对默认成员函数有效
那什么样的类是不希望其他人来调用的它的默认成员函数?
比如IO流
每个IO流对象的缓冲区都是不一样的,随意拷贝都会造成资源混乱。
1.5 其他新功能
在C++98中,类中的内置类型是不对初始化的。而在C++11中出现了缺省参数 可以给类的成员给缺省值。
缺省值
没有缺省值我们得到_a的值是随机值。
给定缺省值 1
委托构造
什么是委托构造? 简单来说就是一个构造函数可以复用其他构造函数
class Person
{
public:Person(const char* name, int age):_name(name), _age(age){}Person(const char* name):Person(name, 18) // 委托构造{}private:gx::string _name; // 自定义类型int _age = 1; // 内置类型
};int main()
{Person s1("张三");return 0;
}
这个委托构造了解一下就行了,说白了还是要调用构造函数。
二、可变参数模板
相比C++98的模板参数,C++11模板参数变成了不是固定的,可以接受任意个类型。和printf函数的可变参数列表是类似的。只是这里的模板参数变成了类型。
下面就是一个基本可变参数的函数模板
// Args是一个模板参数包,args是一个函数形参参数包
// 声明一个参数包Args...args,这个参数包中可以包含0到任意个模板参数。
template <class ...Args>
void ShowList(Args... args)
{}
如果要知道参数包中个数怎么解决?
template<class ...Args>
void ShowList(Args...args)
{cout << sizeof...(args) << endl;
}
int main()
{ShowList(1, 'x');
}
如何解析出参数包里面的值?
利用递归函数展开
void ShowList()
{cout << endl;
}
template <class T ,class ...Args>
void ShowList(const T& val, Args ...args)
{cout << __FUNCTION__ << "(" << sizeof...(args) << ")" << endl;cout << val << endl;ShowList(args...); //语法规定...必须在后面
}
int main()
{ShowList(1, 'A', std::string("sort"));return 0;
}
上面结果确实调用3次ShowList这个函数再加上无参ShowList。
能不能不用模板参数T? 我就想直接用可变模板参数包?可以 。直接再套一层。
void _ShowList()
{cout << endl;
}
template <class T, class ...Args>
void _ShowList(const T& val, Args... args)
{cout << __FUNCTION__ << "(" << sizeof...(args) << ")" << endl;cout << val << endl;_ShowList(args...);
}
template <class ...Args>
void ShowList(Args... args)
{_ShowList(args...);
}int main()
{ShowList(1, 'A', std::string("sort"));return 0;
}
逗号表达式展开参数包
template <class T>
void PrintArg(T t)
{cout << t << " ";
}
//展开函数
template <class ...Args>
void ShowList(Args... args)
{int arr[] = { (PrintArg(args), 0)... };cout << endl;
}
int main()
{ShowList(1);ShowList(1, 'A');ShowList(1, 'A', std::string("sort"));return 0;
}
在上篇的初始化列表 我们知道C++11在arr这个数组创建时,会初始化 列表里面的内容。实现的关键是逗号表达式。我们知道逗号表达式会按顺序执行逗号前面的表达式。
编译器通过解析变成下面表达式
为什么要写出成
(Print(args), 0)
的形式?
这是一个逗号表达式,目的是让整个式子最终返回0
,用于初始化arr
数组
如果不想加0也是可以的。
可变参数模板应用场景又是什么?线程
我们知道C语言中回调函数的传参。C的方案是用的void* 而C++11的线程库用可变参数模板对void* 这个指针进行封装。通过可变参数模板,就可以快乐的传递任何参数。剩下的事交给编译器来干。
可变参数包还可以用于优化STL容器中插入函数。
以容器list为例:
int main()
{list<gx::string> lt;gx::string s1("1111");lt.push_back(s1);lt.emplace_back(s1);return 0;
}
对于是深拷贝的类是没区别的。push_back和emplace_back二者没什么区别。
我们在来看看浅拷贝的类有没有影响
#include "Date.h"
int main()
{/*list<gx::string> lt;gx::string s1("1111");lt.push_back(s1);lt.emplace_back(s1);*/list<Date> lt2;Date d1(2024, 5, 20);Date d2(2024, 5, 21);lt2.push_back(d1);lt2.emplace_back(d2);return 0;}
也是没有差别。
那如果是 d1\d2是右值那?
也是没区别
但是是下面这种就有区别了
emplace_back直接就是构造。这是因为可变参数包在参数传递的过程中,参数包不会展开。直到构造函数才展开。其实这里可以理解成(2023,5,28)它不是一个匿名对象,在参数包的眼里它实际是3个整型。
再比如 下面这个。
有了可变参数包。编译器直接识别为const char* 的字符串。而不是一个匿名对象。
结论:无脑用emplace_back就行。
三、Lambda
在C++11之前,我们如果要对数据进行排序怎么做?用std::sort。
#include <algorithm>
#include <functional>
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());
}
生活中商品太多了难道每一种商品的排序都要写相应的仿函数,是不是有点太麻烦?,假设我们不以价格来进行排序。现在要求按水果的名字排序,是不是又要重写一个仿函数?
有没有一种办法一劳永逸?在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; });
}
上述代码就是使用C++11中的lambda表达式来解决,可以看出lambda表达式实际是一个匿名函
数。
lambda表达式语法
- [capture-list] : 捕捉列表,该列表总是出现在lambda函数的开始位置,编译器根据[]来
判断接下来的代码是否为 lambda 函数 , 捕捉列表能够捕捉上下文中的变量供 lambda函数使用 。
- (parameters):参数列表。与普通函数的参数列表一致,如果不需要参数传递,则可以
连同 () 一起省略
- mutable:默认情况下,lambda函数总是一个const函数,mutable可以取消其常量
性。使用该修饰符时,参数列表不可省略 ( 即使参数为空 ) 。
- ->returntype:返回值类型。用追踪返回类型形式声明函数的返回值类型,没有返回
值时此部分可省略。 返回值类型明确情况下,也可省略,由编译器对返回类型进行推导 。
- {statement}:函数体。在该函数体内,除了可以使用其参数外,还可以使用所有捕获
到的变量。
我们先来一个简单的lambda语法
[](int x, int y)->int {return x + y; };
如果函数体的语句较多我们也是可以这样写代码的
[](int x, int y)->int {return x + y; };
我们如果要调用这个函数对象太长了,我们可以加 auto
auto add1 = [](int x, int y)->int {return x + y; };cout << add1(1, 2) << endl;
最简单的lambda表达式
//最简单的lambda表达式 该lambda表达式没有任何意义[] {};
1.捕捉列表
写一个交换函数。
int x = 1, y = 0;auto swap1 = [](int& rx, int& ry){int tmp = rx;rx = ry;ry = tmp;};swap1(x, y);cout << x << " " << y << endl;
参数列表是可以省略的
省略参数时,我们就要用捕捉列表
这时我们可以在参数列表后面加入关键字,mutable//异变 但是没什么用
还是没有交换
上面的这种捕捉方式叫做传值捕捉,传值具有常性,不能修改 这时我们需要用到引用捕捉
这里的引用捕捉就很坑,不注意看还以为是取地址!!
如果参数太多怎么办?难道要在捕捉列表中一个一个的捕捉吗?当然不用。我们直接全部引用捕捉
//全部引用捕捉
auto swap2 = [&]() {int tmp = x;x = y;y = tmp;};
当然还有其他的捕捉方式
//混合捕捉auto func1 = [&x, y](){//...};//全部传值捕捉auto func3 = [=](){//...};//全部引用捕捉,x传值捕捉auto func4 = [&, x](){//...};
这时我们就可以用lambad来创建线程
int main()
{int n1, n2;cin >> n1 >> n2;thread t1([n1]( int num){for (int i = 0; i < n1; i++){cout << "线程:" << num << " " << i << endl;}cout << endl;},1);thread t2([n2](int num){for (int i = 0; i < n2; i++){cout << "线程:" << num << " " << i << endl;}cout << endl;}, 2);t1.join();t2.join();return 0;
}
如果要m个线程分别打印n次如何操作? 这里我们可以利用vector 把每个线程放进vector这个容器中。
#include <vector>
int main()
{int m, n;cin >> m >> n;vector<int> arr;arr.push_back(m);arr.push_back(n);vector<thread> vthds(m);for (int i = 0; i < arr[0]; i++){vthds[i] = thread([i,arr](){for (int j = 0; j< arr[1]; j++){cout << "线程:" << i << " " << j << endl;}cout << endl;});}for (auto& t : vthds){t.join();}return 0;
}
当然这个打印会错乱,那是因为没有加锁导致线程串行。关于锁的问题我们在后序线程库在详细讲解。
void (*PF)();
int main()
{auto f1 = []{cout << "hello world" << endl; };auto f2 = []{cout << "hello world" << endl; };//f1 = f2; // 编译失败--->提示找不到operator=()// 允许使用一个lambda表达式拷贝构造一个新的副本auto f3(f2);f3();// 可以将lambda表达式赋值给相同类型的函数指针PF = f2;PF();return 0;
}
总结:
[var] :表示值传递方式捕捉变量 var[=] :表示值传递方式捕获所有父作用域中的变量 ( 包括 this)[&var] :表示引用传递捕捉变量 var[&] :表示引用传递捕捉所有父作用域中的变量 ( 包括 this)[this] :表示值传递方式捕捉当前的 this 指针
a. 父作用域指包含 lambda 函数的语句块b. 语法上捕捉列表可由多个捕捉项组成,并以逗号分割 。比如: [=, &a, &b] :以引用传递的方式捕捉变量 a 和 b ,值传递方式捕捉其他所有变量[& , a, this] :值传递方式捕捉变量 a 和 this ,引用方式捕捉其他变量c. 捕捉列表不允许变量重复传递,否则就会导致编译错误 。比如: [=, a] : = 已经以值传递方式捕捉了所有变量,捕捉 a 重复d. 在块作用域以外的 lambda 函数捕捉列表必须为空 。e. 在块作用域中的 lambda函数能捕捉父作用域中局部变量。f. lambda 表达式之间不能相互赋值 ,即使看起来类型相同
函数对象与lambda表达式
lambda的大小是多大?
要清楚这个问题我们需要通过汇编
先搞一个函数对象和lambda的代码
class Rate
{
public:Rate(double rate) : _rate(rate){}double operator()(double money, int year){return money * _rate * year;}private:double _rate;
};
int main()
{// 函数对象double rate = 0.49;Rate r1(rate);r1(10000, 2);// lambdaauto r2 = [=](double monty, int year)->double {return monty * rate * year; };r2(10000, 2);auto f1 = [] {cout << "hello world" << endl; };auto f2 = [] {cout << "hello world" << endl; };//f1 = f2;return 0;
}
f1 和 f2通过汇编我们发现他们两个类名不同,类名不同怎么相互赋值?
这时候我们就能回答大小为什么是1了
在C++中,
sizeof
运算符用来确定一个类型或对象在内存中的大小。对于一个lambda表达式,sizeof
返回的是这个lambda表达式对象在内存中占用的大小。在x86 32位架构上,指针通常是4字节大小。因此,如果你的lambda表达式没有捕获任何局部变量或外部变量(或者只捕获了通过引用捕获的变量),那么lambda表达式的大小很可能是1字节,这是因为:
- Lambda表达式可能被编译器优化为一个很小的函数对象,它只包含一个指向其代码的指针。
- 在某些编译器实现中,lambda表达式可能被优化为一个空的结构体,其中只包含一个指向其代码的指针,因此
sizeof
返回1,表示空结构体的大小。
相关文章:
C++ 11 【可变参数模板】【lambda】
💓博主CSDN主页:麻辣韭菜💓 ⏩专栏分类:C修炼之路⏪ 🚚代码仓库:C高阶🚚 🌹关注我🫵带你学习更多C知识 🔝🔝 目录 前言 一、新的类功能 1.1默认成员函数—…...
c 宏应用举例
1.概要 #include <iostream> //变量可以直接使用 #define fun() a 100; //用变量计算可以 #define fun2(a) a*2; //用变量替换可以 #define fun3(a) d[a] a; //##链接的作用,一般用于链接变量名 #define fun4(type,name) type name##_s 4; //#的作用是转换…...
微信公众号(公众平台) 和 微信开放平台的scope的差异
微信公众号(公众平台) 和 微信开放平台 是两码事。 公众号(公众平台)获取的scope只包括两种:snsapi_base 和snsapi_userinfo,前者是静默获取,用户无感知;后者是需要用户确认同意的。…...
基于pytorch实现的DenseUnet医学图像分割(腹部多脏器)
1、前言 本章将介绍将densenet的主干网络引入unet中 官方实现的代码:kits19-challenge/network at master nitsaick/kits19-challenge (github.com) 本章实现的项目目录如下: 主要代码有train、evaluate、predict脚本 2、代码介绍 数据预处理脚本 数据…...
富格林:正规策划实现安全做单
富格林悉知,在投资理财的过程中,最重要的是控制风险实现安全做单避免损失。但是市场客观因素带来的风险并不能完全避免,因此投资者需要采取一些正规技能来减低风险投资风险实现安全做单。接下来就由富格林给大家分享一些实现安全做单的正规方…...
02. 异常捕捉和处理
检索特定内容的邮件,当检索失败,就会在终端输出“获取不了值” try: #代码块A except: #代码B 试一下运行代码A,当代码A报错时,执行代码B 这是main_exe.py文件中的内容 略过 #今天 for job_name,end_time in zip(bji.job_inf…...
Oracle和mysql中插入时间字段
例如有id 和 times两个字段 Oracle insert into xxx values|(1,sysdate) mysql insert into xxx values(1,now()) 在 MySQL 中,SYSDATE() 函数也是可用的,它与 NOW() 类似,但略有不同: NOW…...
注册小程序
每个小程序都需要在 app.js 中调用 App 方法注册小程序实例,绑定生命周期回调函数、错误监听和页面不存在监听函数等。 详细的参数含义和使用请参考 App 参考文档 。 整个小程序只有一个 App 实例,是全部页面共享的。开发者可以通过 getApp 方法获取到全…...
【YOLOv8改进[CONV]】使用MSBlock二次创新C2f模块实现轻量化 + 含全部代码和详细修改方式 + 手撕结构图 + 轻量化 + 涨点
本文将使用MSBlock二次创新C2f模块实现轻量化,助力YOLOv8目标检测效果的实践,文中含全部代码、详细修改方式以及手撕结构图。助您轻松理解改进的方法,实现有效涨点。 改进前和改进后的参数对比: 目录 一 MSBlock 二 使用MSBlock二次创新C2f模块实现轻量化 1 整体修改 …...
three.js使用环境贴图或者加载hdr图
1、three.js使用环境贴图 1.1、效果视频 环境贴图 1.2、使用步骤(个人认为) (1)导入引入相关方法 (2)创建场景 (3)创建相机 (4)添加物体材质 (5…...
GPT-4o多模态大模型的架构设计
GPT-4o:大模型风向,OpenAI大更新 OpenAI震撼发布两大更新!桌面版APP与全新UI的ChatGPT上线,简化用户操作,体验更自然。同时,全能模型GPT-4o惊艳亮相,跨模态即时响应,性能卓越且性价比…...
Facebook:社交世界的引领者
导语 在当今数字化时代,Facebook已经成为了人们社交生活的重要一环。然而,除了成为社交媒体的象征外,它还在不断探索并领导着社交世界的新方向。 1. 社交平台的发展者 Facebook不仅仅是一个社交平台,更是社交方式的引领者。从其…...
qt 加载字体 c++
目录 qt 加载字体 c label设置大小和字体: 资源配置路径失败 解决方法:exe相对目录: pro配置: resource.qrc qt 加载字体 c #include <QApplication> #include <QLabel> #include <QFontDatabase> #incl…...
Linux ldd和ldconfig
ldconfig ldconfig 查看默认库路径和ld.so.conf包含的库路径,来建立运行时动态装载的库查找路径。 ldconfig命令的用途,主要是在默认搜寻目录(/lib和/usr/lib)以及动态库配置文件/etc/ld.so.conf内所列的目录下,搜索出可共享的动态链接库(格式如前介绍,lib*.so*),…...
Python 学习flask创建项目
1、使用pycharm创建flask项目 2、运行访问地址 3、可以看到访问地址内容 4、可以增加路由,尝试访问获取参数...
.NET集成DeveloperSharp实现图片的裁剪、缩放、与加水印
🏆作者:科技、互联网行业优质创作者 🏆专注领域:.Net技术、软件架构、人工智能、数字化转型、DeveloperSharp、微服务、工业互联网、智能制造 🏆欢迎关注我(Net数字智慧化基地),里面…...
阿里发布最强开源大模型通义千问Qwen2,国产最好用的LLM
前言 近年来,大模型技术发展迅速,开源模型的出现为AI研究和应用带来了新的活力。在这一背景下,阿里云通义千问团队发布了全新升级的Qwen2系列开源模型,为国内外开发者提供了更强大的工具和更丰富的选择。 Huggingface模型下载&am…...
探索风电机组:关键软件工具全解析
探索风电机组:关键软件工具全解析 随着可再生能源市场的迅猛发展,风电作为一种重要的可再生能源,其相关技术和工具也越来越受到重视。风电机组的设计、仿真、优化及运维等方面,都需要依靠一系列专业软件工具来实现。这些软件涵盖…...
HOW - CSS 常见效果实现
目录 渐隐渐显曲线&抛物线气泡框水波纹悬浮&漂浮长按控制进度条圆弧&圆形进度条引导蒙层随机物品掉落渐变边框光晕按钮下压反馈头像(圆形半透明阴影) 常见 CSS 效果实现总结。 渐隐渐显 <!DOCTYPE html> <html> <style>…...
EI/CPCI/Scopus会议论文是啥?
EI/CPCI/Scopus会议论文是啥? EI/CPCI/Scopus是学术圈常见的字母缩写了,它们并非某一种期刊或是某一种杂志,而是一种便捷的论文检索工具。它们之间的区别在于,各自涵盖的领域的不同。▌EI (The Engineering Index&…...
【递归、搜索与回溯】穷举vs暴搜vs深搜vs回溯vs剪枝
穷举vs暴搜vs深搜vs回溯vs剪枝 1.全排列2.子集 点赞👍👍收藏🌟🌟关注💖💖 你的支持是对我最大的鼓励,我们一起努力吧!😃😃 管他什么深搜、回溯还是剪枝,画出决…...
celery-redbeat方案(动态定时任务、异步任务)
文章目录 为什么选择 RedBeat?方案坑事项记录 记一次工作上的问题 问题:项目上当前定时任务框架和服务端耦合,容易出现加载定时任务时间很长,影响后端服务启动,容易改动引发定时任务的问题。且能方便的动态的增加或删除…...
js解析成语法树以及还原
const {parse} require("babel/parser"); const traverse require("babel/traverse").default; const generator require("babel/generator").default;// 1.定义要处理的代码 const jscode function square(n) {return n * n; };// 2.使用ba…...
基于python可伸缩JSON格式列表实现
对于消息体为一个json格式列表,列表长度变化的代码设计,如下实现可供参考。 1、python语言实现(直接取值) #codingutf-8n 2 # 行项目数 productCode [11111,222222,333333] unit [H06,H07,H08] qty [6,7,8] items []for i in range(0, n):item …...
h5相机功能
h5相机功能 利用vant input file <template><div class"mb10"><divv-for"(item, index) in info.imgList":key"index"class"imgItem f32 mr20"click"preview(item, index)"><img :src"doFileUrl…...
IDEA | 安装通义灵码插件,开启智能编码旅程
安装步骤 从插件市场安装,点击导航-插件,打开应用市场,搜索通义灵码(TONGYI Lingma),找到通义灵码后点击安装。 https://tongyi.aliyun.com/lingma/download 使用方式 https://help.aliyun.com/documen…...
技术人员如何克服在使用行列视(RCV)过程中遇到的挑战?
技术人员在使用行列视(RCV)过程中可能会遇到多种挑战,以下是一些建议,帮助他们克服这些挑战: 1. 深入了解系统架构和功能: - 熟练掌握RCV的架构设计,包括数据中心层、计算服务层、函数层、人机…...
手把手教你安装 Vivado2019.2(附安装包)
一、Vivado 2019.2优点 Vivado 2019.2 作为 Xilinx 公司发布的一款设计套件版本,具有多个显著的优点,以下是对其优点的详细归纳: 集成度高:开发工具丰富并行综合功能灵活的许可证策略用户友好的界面强大的仿真和验证功能丰富的文…...
Sql-labs的第一关
前言 我们在使用Sql-libs靶场进行Sql注入实验的时候,前提要求我们对mysql数据库结构要有一个大概的了解,因为mysql5.0以上的版本都会自带一个名为information_schema的数据库,这个数据库下面会有columns和tables两个表。 tables这个表的table…...
10_1 Linunx Web服务管理
10_1 Linunx Web服务管理 文章目录 10_1 Linunx Web服务管理[toc]1. 环境准备2. Web服务2.1 Web服务简介 2.2 Web配置2.2.1 提供的默认配置2.2.2 Web服务的主配置文件2.2.3 /etc/httpd/conf/httpd.conf 文件反映出来的”访问控制信息“2.2.4 修改监听端口,访问2.2.5…...
新公司名字注册查询/教程推广优化网站排名
使用领域模型,很少会像创建实际领域模型类、然后使用它们那么简单。很快你就会发现,领域模型必须得到相当数量的基础架构代码的支持。 领域模型所需基础架构当中最显著的当然是持久化——通常是持久化到关系型数据库中,也就是对象/关系&#…...
做盘石信用认证网站/网络销售推广公司
每日签到的功能,供大家参考,具体内容如下首次签到获得1个积分,第二次签到获得2个积分,第三次签到获得3个积分,以此类推但是签到必须每天连续积分才可以递增,如果有中断再次签到时获得积分仍然从1开始递增;user: id,username,count,point,sign_timesign.h…...
阿里云万网网站/餐饮品牌全案策划
需要利用Adobe illustrator(AI)可以快速方便的提取图片的轮廓线并形成矢量图形,同时AI支持导出为dxf和dwg格式,可以再导入CAD或Solidworks、Inventor等建模软件制作三维模型。软件:Adobe illustrator(无版本…...
wordpress 根目录/最新国际消息
亮度和对比度 对RGB色彩图像来讲,亮度越高,像素点对应的RGB值应该越大;亮度越低,像素点对应的RGB值应该越小。而对比度则是用来描述图像颜色与亮度之间的差异感知,对比度越大,图像的每个像素与周围的差异性也就越大,整个图像的细节就越显著;反之亦然。 调整图像亮度和…...
网站建设联系我们/百度网页版电脑版
Celery 是一个简单高效可靠的分布式系统。在处理大量消息,实时处理异步任务,定时执行任务,支持任务调度等方面使用起来更为灵活。📌点击此处查看原文简单理解 Celery 就是发布任务(Producer),消息中间件(Broker)接收任…...
做快三网站/竞价推广是做什么的
第 2 部分 - 对 Android 应用程序包进行签名 ✏️ 在 GitHub 上编辑 可离线查看的 PDF下载 PDF 本指南介绍如何对 Android 应用程序包进行签名。 如果使用较旧版本的 Xamarin Studio(版本 5.9 之前),请参阅 Xamarin Studio 5.8 及更低版…...