C++11的一些实用特性
1.统一的列表初始化
在C++98中,标准允许使用花括号{}对数组或者结构体元素进行统一的列表初始值设定。
//统一的列表初始化
struct Date
{int year;int month;int day;
};void test1()
{Date d1 = { 2024,11,14 };int array1[] = { 1, 2, 3, 4, 5 };int array2[5] = { 0 };}
C++11扩大了用大括号括起的列表(初始化列表)的使用范围,使其可用于所有的内置类型和用户自 定义的类型,使用初始化列表时,可添加等号(=),也可不添加。
//统一的列表初始化
struct Date
{int year;int month;int day;
};void test1()
{Date d1{ 2024,11,14 };const Date& d2{ 2024,11,14 };int array1[]{ 1, 2, 3, 4, 5 };int array2[5]{ 0 };}
1.1.std::initializer_list
std::initializer_list的介绍文档: http://www.cplusplus.com/reference/initializer_list/initializer_list/
std::initializer_list一般是作为构造函数的参数,C++11对STL中的不少容器就增加 std::initializer_list作为参数的构造函数,这样初始化容器对象就更方便了。也可以作为operator= 的参数,这样就可以用大括号赋值。
//用std::initializer_list初始化容器
vector<int> v1 = {2024,11,4,17,30};
map<string,string> dict = {{"sort","排序"},{"sort1","排序1"},{"sort2","排序3"}};
2. 声明
c++11提供了多种简化声明的方式
2.1.auto
C++11中,将auto用于实现自动类型推断。这样要求必须进行显示初始化,让编译器将定义对象的类型设置为初始化值的类型。
vector<int> v = {2,0,2,4,11,14};//auto推导e为v的元素的类型
for(auto& e : v)
{cout << e <<' ';
}//e自动推导为const char*类
auto e = "str";
2.1.decltype
关键字decltype将变量的类型声明为表达式指定的类型。
//decltype的使用场景
const int x = 1;
double y = 2.2;
decltype(x * y) ret; // ret的类型是double
decltype(&x) p; // p的类型是int*
vector<decltype(&x)> v;
2.3.nullptr
由于C++中NULL被定义成字面量0,这样就可能回带来一些问题,因为0既能指针常量,又能表示 整形常量。所以出于清晰和安全的角度考虑,C++11中新增了nullptr关键字,用于表示空指针。
3.范围for
3.1范围for的使用条件
1for循环迭代的范围必须是确定的 对于数组而言,就是数组中第一个元素和最后一个元素的范围;对于类而言,应该提供 begin和end的成员函数返回其迭代器,并且要实现operator++,begin和end就是for循环迭代的范围。
vector<int> v = {2,0,2,4,11,14};//范围for会依次取容器中的值
for(auto& e : v)
{cout << e <<' ';
}for(int e : v)
{cout << e <<' ';
}
4.STL容器的变化
array //对静态数组的封装,operator[]会检查封装,但vector完全够用
https://cplusplus.com/reference/array/
forward_list //单向链表
https://cplusplus.com/reference/forward_list/
unordered_map
https://cplusplus.com/reference/unordered_map/
unordered_set
https://cplusplus.com/reference/unordered_set/
5.右值引用和移动语义
5.1.什么是左值、右值?什么是左值、右值引用?
简单来说,
左值:可以取地址(我们可以获取它的地址+可以对非const左值赋值)
左值可以出现在赋值对象左边
右值:不可以取地址(通常为:常量、临时对象、匿名对象)
右值不可以出现在赋值对象左边
// 以下的p、b、c、*p都是左值int* p = new int(0);int b = 1;const int c = 2;// 以下几个是对上面左值的左值引用int*& rp = p;int& rb = b;const int& rc = c;int& pvalue = *p;double x = 1.1, y = 2.2;// 以下几个都是常见的右值10;x + y;fmin(x, y);// 以下几个都是对右值的右值引用int&& rr1 = 10;double&& rr2 = x + y;double&& rr3 = fmin(x, y);// 这里编译会报错:error C2106: “=”: 左操作数必须为左值/表达式必须是可修改的左值10 = 1;x + y = 1;fmin(x, y) = 1;
左值引用、右值引用之间的相互转换:不能直接转换
// 左值引用只能引用左值,不能引用右值。
int a = 10;
int& ra1 = a; // ra为a的别名
//int& ra2 = 10; // 编译失败,因为10是右值
// const左值引用既可引用左值,也可引用右值。
const int& ra3 = 10;
const int& ra4 = a;
// 右值引用只能右值,不能引用左值。
int&& r1 = 10;// error C2440: “初始化”: 无法从“int”转换为“int &&”
// message : 无法将右值引用绑定到左值
int a = 10;
int&& r2 = a;// 右值引用可以引用move以后的左值
int&& r3 = std::move(a);
//move的实质相当于
int&& rrx5 = (int&&)a;
5.2.右值引用的意义
右值引用:可以减少拷贝
左值引用解决的场景:引用传参、引用传返回值
左值引用没有解决的场景:传返回值
右值可以分为两种
1.纯右值:内置类型右值
2.将亡值:类、结构体类型右值(生命周期只在当前作用域的)
那右值引用怎么减少拷贝呢?
移动构造
class string
{
public://移动构造string(string&& s):str(nullptr){//移动拷贝,抢夺资源//所以右值引用即为标记//s为右值引用,可能是将亡值,会直接将s的资源抢给自己swap(s,*this);}
private:char* str;};
稍早一点的编译器,C++11之前,在实践使用中要求避免对象传值返回(为节省资源),C++11出现后彻底解决了这样的问题
当然右值引用使用的场景除了移动构造外还有移动赋值等,即用此种方法实现operator=(),C++11后STL中也用了这样的设计
另外还需注意,右值引用本身的属性是——>左值,如果还是右值无法修改
为什么呢?因为只有右值引用本身属性是左值,才能传递他的资源
即:传递过程中会退化
//r1的属性为左值
string&& r1 = string("2222");
5.3.函数模版中的引用
左值引用、右值引用在模板中的使用值得注意
template<class T> //引用折叠
void Func(T&& x) //传左值即为左值引用,传右值即为右值引用
{}
// 模板中的&&不代表右值引用,而是万能引用,其既能接收左值又能接收右值。
// 模板的万能引用只是提供了能够接收同时接收左值引用和右值引用的能力
// 但是引用类型的唯一作用就是限制了接收的类型,后续使用中都退化成了左值
// 我们希望能够在传递过程中保持它的左值或者右值的属性, 就需要用我们下面学习的完美转发
5.4.完美转发
完美转发要用的forward函数它包含在<utility>中。
forward - C++ Referencey
右值引用本身属性是——左值,为什么呢?
因为只有右值引用本身属性是左值,才能转移他的资源。即右值在传递过程中会退化。
而在语法层我们无法判断一个引用本质引用的左值还是右值,完美转发可以解决这个问题。
若t为左值,保持属性直接传参给Fun。
若t为右值,传入时右值引用属性会退化成左值,forward会将其转换成右值再传给Func。
void Fun(int& x) { cout << "左值引用" << endl; }
void Fun(const int& x) { cout << "const 左值引用" << endl; }
void Fun(int&& x) { cout << "右值引用" << endl; }
void Fun(const int&& x) { cout << "const 右值引用" << endl; }template<typename T>
void PerfectForward(T&& t)
{//模板实例化左值引用,保持属性直接传参给Fun//模板实例化右值引用,右值引用属性会退化成左值,转换成右值再传给FuncFun(forward<T>(t));
}
6.新的类功能
C++11 新增了两个默认成员函数:移动构造函数和移动赋值运算符重载。
移动构造函数和移动赋值运算符重载:
- 如果你没有自己实现移动构造函数,且没有实现析构函数 、拷贝构造、拷贝赋值重载中的任 意一个。那么编译器会自动生成一个默认移动构造。
- 如果你没有自己实现移动赋值重载函数,且没有实现析构函数 、拷贝构造、拷贝赋值重载中的任 意一个。那么编译器会自动生成一个默认移动构造。
- 如果你提供了移动构造或者移动赋值,编译器不会自动提供拷贝构造和拷贝赋值。
默认移动构造会将内置类型按字节拷贝,自定义类型实现了移动构造调移动构造,没实现调用其拷贝构造。移动赋值与移动构造类似。
需要显式实现析构说明有资源需要释放,则:
- 说明需要显式写拷贝构造和赋值重载
- 说明需要显式写移动构造和移动赋值
默认生成的移动构造对Date这样的没有申请资源的类,没什么意义,与拷贝构造功能一样,对Person这样(申请了资源的类)很有意义。Person为右值时,内部的string也是右值,string就可以走移动构造提高效率。
强制生成默认函数的关键字default:
C++11可以让你更好的控制要使用的默认函数。假设你要使用某个默认的函数,但是因为一些原 因这个函数没有默认生成。比如:我们提供了拷贝构造,就不会生成移动构造了,那么我们可以 使用default关键字显示指定移动构造生成。
class HashTable
{
public:HashTable() = default;
}
禁止生成默认函数的关键字delete:
如果能想要限制某些默认函数的生成,在C++98中,是该函数设置成private,并且只声明补丁 已,这样只要其他人想要调用就会报错。在C++11中更简单,只需在该函数声明加上=delete即 可,该语法指示编译器不生成对应函数的默认版本,称=delete修饰的函数为删除函数。
class HashTable
{
public:HashTable() = delete;
}
7.可变参数模板
C++11的新特性可变参数模板能够让你创建可以接受可变参数的函数模板和类模板。可变参数模板的参数类型个数可变。
下面就是一个基本可变参数的函数模板:
template <class ...Args>//Args是一个模板参数包
void ShowList(Args... args)//args是一个函数形参参数包
{//可变模板参数模板编译时解析cout<< sizeof...(args)<<endl;
}
由于语法不支持使用args[i]这样方式获取可变 参数,所以我们的用下面的方法获取参数包的值。
递归函数方式展开参数包
//解析方式1
//编译时递归推导解析参数
void Print()
{}
template<class T,class ...Args>
void Print(T&& x, Args&& ...args)
{cout << x << ' ';//参数包参数数量为零时会调用无参的重载函数Print(args...);
}
template<class ...Arg>
void showList(Args&& ...args)
{Print(args...);
}
逗号表达式展开参数包
expand函数中的逗号表达式:(printarg(args), 0),也是按照这个执行顺序,先执行 printarg(args),再得到逗号表达式的结果0。通过初始化列表来初始化一个变长数组, {(printarg(args), 0)...}将会展开成((printarg(arg1),0), (printarg(arg2),0), (printarg(arg3),0), etc... ),最终会创建一个元素值都为0的数组int arr[sizeof...(Args)]。由于是逗号表达式,在创建数组的过程中会先执行逗号表达式前面的部分printarg(args) 打印出参数,也就是说在构造int数组的过程中就将参数包展开了,这个数组的目的纯粹是为了在数组构造的过程展开参数包。
template <class T>
void PrintArg(T t)
{cout << t << " ";
}
//展开函数
template <class ...Args>
void ShowList(Args... args)
{int arr[] = { (PrintArg(args), 0)... };//int arr[] = {(cout << (args)<<' ',0)...};cout << endl;
}
emplace系列的接口,支持模板的可变参数,并且万能引用。emplace系列可以将参数包向下传递(就可以直接调取底层元素的构造函数)。
emplace系列总体而言更加高效,推荐使用。特别是对于Date这种没有拷贝构造、移动构造概念的类很高效。
int main()
{std::list< std::pair<int, char> > mylist;// emplace_back支持可变参数,拿到构建pair对象的参数后自己去创建对象// 除了用法上,和push_back没什么太大的区别mylist.emplace_back(10, 'a');mylist.emplace_back(20, 'b');mylist.emplace_back(make_pair(30, 'c'));mylist.push_back(make_pair(40, 'd'));mylist.push_back({ 50, 'e' });for (auto e : mylist)cout << e.first << ":" << e.second << endl;return 0;
}
int main()
{// 带有拷贝构造和移动构造的bit::string// 其实差别也不大,emplace_back是直接构造了,push_back// 是先构造,再移动构造。std::list< std::pair<int, bit::string> > mylist;mylist.emplace_back(10, "sort");mylist.emplace_back(make_pair(20, "sort"));mylist.push_back(make_pair(30, "sort"));mylist.push_back({ 40, "sort"});return 0;
}
8.lambda表达式
格式:
捕捉列表 参数 可修改性 返回值 函数体
[capture_list] (parameters)mutable->returntype{statement}
√ 可省 可省 可省 √
[capture-list] : 捕捉列表,该列表总是出现在lambda函数的开始位置,编译器根据[]来判断接下来的代码是否为lambda函数,捕捉列表能够捕捉上下文中的变量供lambda 函数使用。
(parameters):参数列表。与普通函数的参数列表一致,如果不需要参数传递,则可以连同()一起省略
mutable:默认情况下,lambda函数总是一个const函数,mutable可以取消其常量性。使用该修饰符时,参数列表不可省略(即使参数为空)。
->returntype:返回值类型。用追踪返回类型形式声明函数的返回值类型,没有返回值时此部分可省略。返回值类型明确情况下,也可省略,由编译器对返回类型进行推 导。
{statement}:函数体。在该函数体内,除了可以使用其参数外,还可以使用所有捕获到的变量。
// 最简单的lambda表达式, 该lambda表达式没有任何意义[]{}; // 省略参数列表和返回值类型,返回值类型由编译器推导为intint a = 3, b = 4;[=]{return a + 3; }; // 省略了返回值类型,无返回值类型auto fun1 = [&](int c){b = a + c; }; fun1(10)cout<<a<<" "<<b<<endl;// 各部分都很完善的lambda函数auto fun2 = [=, &b](int c)->int{return b += a+ c; }; cout<<fun2(10)<<endl;// 复制捕捉xint x = 10;auto add_x = [x](int a) mutable { x *= 2; return a + x; }; cout << add_x(10) << endl;
lambda表达式其本质为匿名函数对象
捕捉列表
int main()
{int a = 1, b = 2;//lambda只能用当前lambda局部域和捕捉的对象和全局对象//传值捕捉本质是一种拷贝,并且const修饰了auto swap2 = [a, b]()mutable//mutable慎用,mutable即——可修改的{ //mutable相当于去掉const属性,可以修改了//修改不会影响外面被捕捉的值,因为是一种拷贝int tmp = a;a = b;b = tmp;};//引用捕捉,默认可修改auto swap3 = [&a, &b](){};}
[=]//所有值的传值捕捉(本质上只会捕捉函数体中使用了的对象)
[&]//所有值引用捕捉(本质上只会捕捉函数体中使用了的对象)
[&a,b]//混合捕捉
[&,b]//除b外其他全部引用捕捉
底层:
捕捉列表的对象是成员变量存储在lambda类对象中
捕捉的本质是构造函数的初始化列表
注意:
1. 父作用域指包含lambda函数的语句块
2. 语法上捕捉列表可由多个捕捉项组成,并以逗号分割。 比如:[=, &a, &b]:以引用传递的方式捕捉变量a和b,值传递方式捕捉其他所有变量 [&,a, this]:值传递方式捕捉变量a和this,引用方式捕捉其他变量
3. 捕捉列表不允许变量重复传递,否则就会导致编译错误。 比如:[=, a]:=已经以值传递方式捕捉了所有变量,捕捉a重复
4. 在块作用域以外的lambda函数捕捉列表必须为空。
5. 在块作用域中的lambda函数仅能捕捉父作用域中局部变量,捕捉任何非此作用域或者 非局部变量都 会导致编译报错。 f. lambda表达式之间不能相互赋值,即使看起来类型相同
9.包装器
function包装器 function包装器 也叫作适配器。可以将1.函数指针 2.仿函数 3.lambda包装起来。
function - C++ Reference
function在头文件<functional>
模板参数说明:
Ret: 被调用函数的返回类型
Args…:被调用函数的形参
包装器使用方法如下:
int f(int a, int b)
{return a + b;
}
struct Functor
{
public:int operator() (int a, int b){return a + b;}
};
class Plus
{
public:static int plusi(int a, int b){return a + b;}double plusd(double a, double b){return a + b;}
};int main()
{// 函数名(函数指针)std::function<int(int, int)> func1 = f;cout << func1(1, 2) << endl;// 函数对象std::function<int(int, int)> func2 = Functor();cout << func2(1, 2) << endl;// lamber表达式std::function<int(int, int)> func3 = [](const int a, const int b){return a + b; };cout << func3(1, 2) << endl;// 包装静态成员函数std::function<int(int, int)> func4 = &Plus::plusi;cout << func4(1, 2) << endl;//包装普通成员函数,因为普通成员函数隐患this指针,(第一个参数传对象或指针)//因为底层无论是对象或指针都是通过对象调成员函数std::function<double(Plus*, double, double)> func5 = &Plus::plusd;cout << func5(&Plus(), 1.1, 2.2) << endl;std::function<double(Plus, double, double)> func6 = &Plus::plusd;cout << func6(Plus(), 1.1, 2.2) << endl;return 0;
}
还可以用map将对象与函数进行映射:
//用operator[]进行访问
map < string, function<int(int, int)>> opFuncMap;
bind
一般用于绑定一些固定参数,bind的返回值返回一个仿函数
using placeholders::_1;
using placeholders::_2;
int main()
{//调整参数顺序auto sub1 = bind(sub, _1, _2);//_1代表第一个实参,_2代表第二个实参以此类推auto sub2 = bind(sub, _2, _1);cout << sub2(10, 5) << endl;//调整参数个数(常用)auto sub3 = bind(sub, 100, _1);//绑定死第一个形参cout << sub3(20) << endl;}
相关文章:
C++11的一些实用特性
1.统一的列表初始化 在C98中,标准允许使用花括号{}对数组或者结构体元素进行统一的列表初始值设定。 //统一的列表初始化 struct Date {int year;int month;int day; };void test1() {Date d1 { 2024,11,14 };int array1[] { 1, 2, 3, 4, 5 };int array2[5] { …...
23种设计模式-观察者(Observer)设计模式
文章目录 一.什么是观察者模式?二.观察者模式的结构三.观察者模式的应用场景四.观察者模式的优缺点五.观察者模式的实现(C示例)六.观察者模式的实现(JAVA示例)七.代码解释八.总结 类图: 观察者设计模式类图…...
【CUDA】Branch Divergence and Unrolling Loop
目录 一、避免分支发散 1.1 并行规约问题 1.2 并行规约中的发散 二、UNrolling Loops 一、避免分支发散 控制流有时依赖于 thread 索引。同一个warp中,一个条件分支可能导致性能很差。通过重新组织数据获取模式可以减少或避免 warp divergence。具体问题查看下…...
深度学习:卷积神经网络的计算复杂度,顺序操作,最大路径长度
卷积层的计算复杂度 在深度学习中,卷积层的计算复杂度主要取决于卷积核的大小、输入和输出的通道数量、以及输入序列的长度。具体来说,卷积层的计算复杂度可以通过以下几个因素来计算: 卷积核大小 k:卷积核的大小决定了每次卷积操…...
springboot 配置文件中 multipart.max-file-size 各个版本的写法
由于springboot具有几个版本,不同版本对于文件上传最大限制的配置也有所不同。 所以要注意springboot本身的版本,不然会一直报错 在springboot1.3版本中: multipart.maxFileSize在springboot1.4与springboot1.5版本中: spring…...
linux 中mysql查看慢日志
1、到mysql容器,先登录到数据库,查看是否开启 mysql -h 127.0.0.1 -uroot -p SHOW VARIABLES LIKE slow_query_log; 2、如果没有开启,需要先开启 set global slow_query_log ON; 3、查看慢日志文件 SHOW VARIABLES LIKE slow_query_log…...
单片机的基本组成与工作原理
单片机(Microcontroller Unit, MCU)是一种将计算机的主要部分集成在一个芯片上的小型计算机系统。它通常包括中央处理器(CPU)、存储器(Memory)、输入输出接口(I/O Ports)、定时器/计…...
智慧隧道和智慧交通
通过引入先进的物联网技术,将各种硬件设备如传感器、摄像头、控制系统等有效地连接并管理起来,以实现道路安全和交通流畅的目标。这些设备将能够实时监控和控制隧道内的各种设备和系统,从而提高道路安全、提升驾驶体验并降低管理成本。 在这个…...
List、Set、Map详解和区别
在 Java 中,List、Set、Map是常用的集合类型,它们各自具有不同的特点和用途,以下是对它们的详细介绍及区别分析: List(列表) 特点: 有序性:List中的元素是有序的,即元素…...
界面控件DevExpress WinForms v24.2新功能预览 - 支持.NET 9
DevExpress WinForms 拥有180组件和UI库,能为Windows Forms平台创建具有影响力的业务解决方案。DevExpress WinForms能完美构建流畅、美观且易于使用的应用程序,无论是Office风格的界面,还是分析处理大批量的业务数据,它都能轻松胜…...
Postman之pm.test断言操作
Postman之pm.test断言操作 1.断言方法2.连接符3.条件判断符 用于验证请求的响应数据是否符合预期 1.断言方法 pm.test():定义一个测试函数,接受两个参数,一个字符串参数用来描述该测试,一个返回True/False的函数 语法格式&#…...
对数几率回归
对数几率回归简介 对数几率回归(Logistic Regression)是一种用于解决分类问题的经典统计模型,其核心思想是利用逻辑函数(Sigmoid函数)将线性回归模型的输出值映射到概率范围 [0, 1],从而实现分类预测。对数…...
docker 配置同宿主机共同网段的IP 同时通过通网段的另一个电脑实现远程连接docker
docker配置网络 #宿主机执行命令 ifconfig 查询对应的主机ip 子网掩码 网关地址 #[网卡名称]:inet[主机IP] netmask[子网掩码] broadcast[网关地址]这里需要重点关注:eno1[网卡名称]以及【192.168.31.225】网关地址 在宿主机执行docker命令创建一个虚拟…...
4-7-1.C# 数据容器 - LinkedList(LinkedList 的定义、LinkedList 结点的遍历、LinkedList 的常用方法)
LinkedList 概述 LinkedList<T> 通过节点(Node)来存储数据,每个节点包含数据和指向下一个节点的引用 LinkedList<T> 存储的元素是可重复的 LinkedList<T> 支持泛型,可以指定存储的元素的类型 LinkedList<…...
「三」体验HarmonyOS端云一体化开发模板——使用DevEco Studio直接创建端云一体化工程
关于作者 白晓明 宁夏图尔科技有限公司董事长兼CEO、坚果派联合创始人 华为HDE、润和软件HiHope社区专家、鸿蒙KOL、仓颉KOL 华为开发者学堂/51CTO学堂/CSDN学堂认证讲师 开放原子开源基金会2023开源贡献之星 「目录」 「一」HarmonyOS端云一体化概要 「二」体验HarmonyOS端云一…...
确保以管理员权限运行 Visual Studio 开发者命令提示符
文章目录 解决方法:1. 以管理员身份运行命令提示符2. 改变目录权限3. 改变项目目录位置4. 检查文件系统权限 总结: ********************************************************************** ** Visual Studio 2022 Developer Command Prompt v17.12.0 …...
命令执行简单(棱角社区有毒)
前言:小迪安全2022第一节反弹shell,小迪用的是两台都是云服务器,没有服务器可以在自己的主机上搭建也是可以的,主机上搭两个网站 思路:生成一个木马文件,下载到本机,然后利用本机上传到目标主机…...
Keil基于ARM Compiler 5的工程迁移为ARM Compiler 6的工程
环境: keil版本为5.38,版本务必高于5.30 STM32F4的pack包版本要高于2.9 软件包下载地址:https://zhuanlan.zhihu.com/p/262507061 一、更改Keil中编译器 更改后编译,会报很多错,先不管。 二、更改头文件依赖 观察…...
Kafka-创建topic源码
一、命令创建topic kafka-topics --create --topic quickstart-events --bootstrap-server cdh1:9092 --partitions 2 --replication-factor 2 二、kafka-topics脚本 exec $(dirname $0)/kafka-run-class.sh org.apache.kafka.tools.TopicCommand "$" 脚本中指定了…...
【网络安全】(一) 0成本添加访问级监控
互联网的安全感这个概念源于阿里。顾名思义,让互联网的用户对于web产品能够产生足够的信任和依赖。特别是涉及到用户资金交易的站点,一次严重的用户资料泄露就可以彻底毁掉你的品牌。 然而当前阶段除了bat大部分互联网行业的企业对于网络安全给的重视都…...
【Three.js基础学习】26. Animated galaxy
前言 shaders实现星系 课程回顾 使用顶点着色器为每个粒子设置动画 a属性 , u制服 ,v变化 像素比:window.devicePixelRatio 自动从渲染器检索像素比 renderer.getPixelRatio() 如何尺寸衰减, 放大缩小视角时,粒子都是同…...
vscode使用ssh配置docker容器环境
1 创建容器,并映射主机和容器的指定ssh服务端口 2 进入容器 docker exec -it <容器ID> /bin/bash 3在容器中安装ssh服务 apt-get update apt-get install openssh-server 接着修改ssh文件信息,将容器的10008端口暴露出来允许root用户使用ssh登录 vim /…...
NLP论文速读(EMNLP 2024)|动态奖励与提示优化来帮助语言模型的进行自我对齐
论文速读|Dynamic Rewarding with Prompt Optimization Enables Tuning-free Self-Alignment of Language Models 论文信息: 简介: 本文讨论的背景是大型语言模型(LLMs)的自我对齐问题。传统的LLMs对齐方法依赖于昂贵的训练和人类偏好注释&am…...
【LeetCode】167. 两数之和 II - 输入有序数组
描述 给定一个下标从 1 开始的整数数组numbers,该数组已按非递减顺序排列,请从数组中找出满足相加之和等于目标数target的两个数。如果这两个数分别是numbers[index1]和numbers[index2],返回整数数组[index1, index2]。 只存在唯一答案&#…...
Getx:GetxController依赖管理02,Binding绑定全局控制器(懒加载Controller)
在使用GetX 状态管理器的时候,如果每个页面都手动实例化一个控制器就太麻烦了, Binding 的作用就是所有需要进行状态管理的控制器进行统一初始化 创建全局控制器Binding import package:get/get.dart; import ../controllers/counter.dart; // 同上一篇内…...
leetcode 找不同
389. 找不同 已解答 简单 相关标签 相关企业 给定两个字符串 s 和 t ,它们只包含小写字母。 字符串 t 由字符串 s 随机重排,然后在随机位置添加一个字母。 请找出在 t 中被添加的字母。 示例 1: 输入:s "abcd"…...
2025 - 生信信息学 - GEO数据分析 - RF分析(随机森林)
GEO数据分析 - RF分析(随机森林) 01 准备数据文件 #install.packages("randomForest")#引用包 library(randomForest) set.seed(123456)inputFile"diffGeneExp.txt" #输入文件 setwd("/Users/wangyang/Desktop/BCBM/02ra…...
Matlab深度学习(四)——AlexNet卷积神经网络
网络搭建参考:手撕 CNN 经典网络之 AlexNet(理论篇)-CSDN博客 在实际工程应用中,构建并训练一个大规模的卷积神经网络是比较复杂的,需要大量的数据以及高性能的硬件。如果通过训练好的典型网络稍加改进…...
etcd defrag
场景 prometheus监控告警,告警信息如下 etcd cluster "kube-etcd": database size in use on instance xx is 33.45% of the actual allocated disk space, please run defragmentation (e.g. etcdctl defrag) to retrieve the unused fragmented disk space.处理…...
golang语言整合jwt+gin框架实现token
1.下载jwt go get -u github.com/dgrijalva/jwt-go2.新建生成token和解析token文件 2.1 新建common文件夹和jwtConfig文件夹 新建jwtconfig.go文件 2.2 jwtconfig.go文件代码 /* Time : 2021/8/2 下午3:03 Author : mrxuexi File : main Software: GoLand */ package jwtC…...
杭州高端网站开发/抖音关键词推广怎么做
剪应力互等定理确保“6个应力6个应变”参数即可描述一个微分单元,而不需各9个参数。 切应力互等定理: 在相互垂直平面上,切应力成对存在且数值相等,两者都垂直于两个平面的交线,方向则共同指向或共同背离这一交线。 成…...
什么是经营性网站备案/个人优秀网页设计
最近在用eclipse做项目,新建项目时什么都贪新,用最新的版本,在Dynamic web module version栏里选了最新的3.0版本,布署项目的时候就出现了如期的错误,在网上看到http://hi.baidu.com/yolanda441/b ... 41d36dd1164e2e.…...
教育类php开源网站/网站空间租用
定义和用法当拖拽对象时定位光标。默认情况下,光标是出现在被拖拽对象的中间。使用 cursorAt 选项来指定相对于 draggable 的另一个 位置(指定一个相对于 top、right、bottom、left 的像素值)。通过提供一个带有有效的 CSS 光标值的 cursor 选…...
网站关键词排名优化方法/百度关键词首页排名服务
蒙特卡洛方法(Monte Carlo method,也有翻译成“蒙特卡罗方法”)是以概率和统计的理论、方法为基础的一种数值计算方法,将所求解的问题同一定的概率模型相联系,用计算机实现统计模拟或抽样,以获得问题的近似…...
网站 维护 费用/百度推广服务费一年多少钱
原文 http://www.cnblogs.com/ybgame/p/3588795.html 在最近,使用U3D开发的游戏核心部分功能即将完成,中间由于各种历史原因,导致项目存在比较大的问题,这些问题在最后,恐怕只能通过一次彻底的重构来解决 现在的游…...
运用vs2010c 做网站/百度收录提交申请网站
目录 经典RDA 距离向压缩 方位向傅里叶变换 距离徙动校正 相位补偿 插值 方位压缩和方位向逆傅里叶变换 考虑SRC的RDA 距离向频域匹配滤波 方位向傅里叶变换 SRC 距离向IFFT RCMC 方位向压缩与IFFT 由于原文公式较多,所以本文部分内容以截图的形式分享给…...