【c++11】c++11新特性(上)(列表初始化、右值引用和移动语义、类的新默认成员函数、lambda表达式)
🌟🌟作者主页:ephemerals__
🌟🌟所属专栏:C++
目录
前言
一、列表初始化
1. 大括号初始化
2. initializer_list
二、右值引用和移动语义
1. 左值和右值
2. 左值引用和右值引用
引用延长生命周期
左值引用和右值引用的参数匹配原则
右值引用的适用场景
引用折叠与万能引用
完美转发
三、类的新默认成员函数
1. 移动构造函数
2. 移动赋值函数
四、lambda表达式
1. 捕捉列表
显式捕捉
隐式捕捉
混合捕捉
捕捉列表的其他要点
2. lambda表达式的适用场景
总结
前言
c++11 标准的发布为 c++ 带来了革命性的变化,引入了许多强大的新特性,使代码更简洁、高效且现代化。这些特性不仅提升了开发效率,还优化了性能,是现代 c++ 编程的重要基石。本篇文章,我们将重点探讨 c++11 的几个核心改进:列表初始化、右值引用和移动语义、类的新默认成员函数以及lambda表达式。
一、列表初始化
1. 大括号初始化
在c++98中,允许数组和结构体使用大括号初始化,例如:
#include <iostream>
using namespace std;struct STU
{int a;double b;
};int main()
{int arr[5] = { 1,2,3,4,5 };STU s = { 3,5.5 };return 0;
}
而在c++11之后,统一了初始化方式,“ 一切对象 ”均可以用大括号进行初始化(也叫做列表初始化),十分方便。举例:
int a = { 2 };
const STU& rs = { 3,5.5 }; //引用临时对象
对于自定义类型,使用大括号初始化本质是一种隐式类型转换,会产生临时对象,不过很多编译器会将其进行优化为直接构造对象。
注意:使用大括号初始化时,赋值符号可以省略。
int a{ 1 };
STU s{ 2,3.1 };
const STU& rs{ 3,5.5 };
c++11的大括号初始化方式,也在某些场景下带来了许多便利,例如调用容器接口操作多参数类型构造的对象时:
#include <iostream>
#include <vector>
#include <string>
using namespace std;int main()
{vector<pair<string, int>> v;//v.push_back(pair<string, int>("hello", 1)); //传统的方式--构造匿名对象v.push_back({ "hello", 1 }); //使用大括号构造pair,十分方便return 0;
}
2. initializer_list
虽然刚才提到的大括号初始化已经十分方便,但是对于容器的多元素初始化,仍旧有些麻烦。所以c++11引入了一个新容器 -- initializer_list(初始化列表/初始化器),并在STL各种容器中增加了有它支持的构造函数、拷贝构造函数和赋值重载。代码示例:
#include <iostream>
#include <vector>
#include <list>
#include <map>
using namespace std;int main()
{vector<int> v = { 1,2,3,4,5 };list<double> l = { 3.1,5.2,4.8 };map<string, int> m = { {"hello", 1}, {"hehe", 3} };return 0;
}
这里赋值使用的大括号及其内部元素,即是initializer_list。它也有自己的定义方式:
//两种方式均可
auto il1 = { 1,2,3,4,5 };
initializer_list<int> il2 = { 1,2,3,4,5 };
initializer_list的本质是一个数组,其元素存放在栈区当中,它的迭代器是原生指针,内部有两个迭代器分别指向其开始位置和结束位置。我们使用它对容器进行构造或赋值时,是构造了一个initializer_list的对象,然后调用容器的相应函数去遍历initializer_list,一个个地构造。
二、右值引用和移动语义
在某些情况下,使用传统的左值引用,并不能提高效率:
vector<string> v;
v.push_back("hello"); //“hello”是临时对象,不能直接进行引用
而在c++11当中,引入了一种新的引用--右值引用。
1. 左值和右值
左值:一般是一个持久存在的表达式, 有明确内存地址,可以进行取地址操作。左值既可以放在赋值号左边,也可以放在赋值号右边。
右值:指那些临时性的,即将被销毁的,以及常量表达式,没有明确的内存地址,不能进行取地址操作。右值不能放在赋值号左边。
2. 左值引用和右值引用
顾名思义,左值引用是给左值取别名,右值引用是给右值取别名。举个例子:
#include <iostream>
using namespace std;int main()
{int a = 0;int& r1 = a; //左值引用int&& r2 = 1; //右值引用return 0;
}
左值引用不能直接引用右值,需要加上const;右值引用不能直接引用左值,需要将左值使用move函数包装起来(move将左值转化为右值引用)。示例:
#include <iostream>
using namespace std;int main()
{const int& r1 = 1; //左值引用引用右值int a = 0;//右值引用引用左值int&& r2 = (int&&)a; //强转int&& r3 = move(a); //使用move函数return 0;
}
需要注意:这里的 r2 和 r3 虽然是右值引用,但是 r2 和 r3 本身还是左值,是可以取到地址的。
在语法层面上看,左值引用和右值引用都是给变量或常量取别名,不会开辟内存。但是从底层实现的角度上讲,左值引用和右值引用本质都是用指针实现的,与指针并没有什么区别。我们在学习语法的时候,语法所表达的意义与底层可能是背离的,尽量不要混到一起,容易陷入迷途。
引用延长生命周期
const左值引用和右值引用都可以延长临时对象的生命周期,直至引用的生命周期结束,但const左值引用所引用的对象不可被修改;而通过右值引用,可以修改所引用的临时对象,因为右值引用本身是左值。
示例:
#include <iostream>
using namespace std;int main()
{const int& r1 = 1 + 3;r1++; // 报错,表达式必须是可修改的左值int&& r2 = 1 + 3;r2++; // 可以修改return 0;
}
左值引用和右值引用的参数匹配原则
在c++98当中,被const修饰的左值引用形参既可以接收左值,也可以接收右值。而在c++11当中,由于引入了右值引用,所以当同时存在两个形参分别为右值引用和const的左值引用的重载函数时,如果我们传入左值,那么会优先调用const左值引用的重载函数;如果传入右值,则会优先调用右值引用版本的重载函数。
代码示例:
#include <iostream>
using namespace std;//const左值引用版本
void func(const int& x)
{cout << "调用左值引用" << endl;
}//右值引用版本
void func(int&& x)
{cout << "调用右值引用" << endl;
}int main()
{int a = 0;func(a); // 传入左值func(1); // 传入右值func(move(a)); // 传入右值return 0;
}
注意:在右值引用版本的重载函数中,参数x的性质是左值(之前已经提到),所以如果要将x作为参数传入一个形参是右值引用的函数中,需要使用move或强转为右值引用类型。
那么,右值引用存在的意义是什么呢?实际上右值引用的核心价值在于支持移动语义,主要体现在移动构造和移动赋值这两个新默认成员函数中。我们具体分析一下。
右值引用的适用场景
虽然说左值引用可以在对象的传参和返回时减少拷贝,提高效率。但如果对象在函数体内部创建,其离开函数体时就会销毁。如果要传值返回或强行传引用返回,就会发生拷贝/出现野引用。
此时右值引用的作用就体现出来了:右值引用可以接收即将被销毁的对象,再以左值的形式,在对象销毁之前,配合移动构造或移动赋值,将对象的资源直接移走,避免拷贝,从而提效。
string类的移动构造和移动赋值实现示例:
//移动构造
//接收一个右值,通过右值引用转化为左值
string(string&& s)
{swap(s);//使用swap直接掠夺即将销毁的对象的资源
}//移动赋值
string& operator=(string&& s)
{swap(s);return *this;
}
有了移动构造,函数体内部定义的对象传值返回后,由于返回值是即将销毁的对象,会被移动构造给临时对象,临时对象再移动构造/移动赋值给当前接收对象,这样就完成了两次资源转移,在没有编译器优化的情况下也避免拷贝。
传参时,如果传入临时对象,也会通过移动构造直接将资源进行移动,免去了对象拷贝时的时间消耗。
注意:如果我们将左值经过move转化传给移动构造,那么左值的资源会被掠夺。
string s2 = move(s1); // 此时s1的资源被掠夺
引用折叠与万能引用
c++不能直接定义引用的引用,但我们可以使用typedef的方式间接定义引用的引用,称之为引用折叠。示例:
#include <iostream>
using namespace std;typedef int& lr;
typedef int&& rr;int main()
{int a = 0;lr& r1 = a;lr&& r2 = a;rr& r3 = a;rr&& r4 = 1;return 0;
};
这样就会产生四种甚至更多的引用类型,显得十分杂乱。为了使这种语法兼具实用性和简洁性,c++规定引用折叠的规则是:右值引用的右值引用表示右值引用,其余均表示左值引用。所以这里的r1,r2,r3都是左值引用,r4是右值引用。
引用折叠的机制与模板相结合,产生了“万能引用”:
template<class T>
void func(T&& x)
{//...
}
当给func函数传入左值时,T会被实例化为左值引用类型,与右值引用折叠成左值引用;当传入右值时,T会被实例化为右值类型,与“&&”结合形成右值引用。
万能引用使得模板函数在接受参数时既能处理左值,也能处理右值,使代码更具灵活性和可扩展性。
完美转发
如果我们给万能引用函数传入右值,由于右值引用变量本身是左值,所以如果用这个右值引用在内部嵌套调用其他函数,就无法保持参数的属性(传入的其实为左值),从而无法达到预期效果。为此C++提供了一个函数forward(完美转发),保持属性。
示例:
#include <iostream>
#include <utility>
using namespace std;void func2(int& x)
{cout << "左值版本" << endl;
}void func2(int&& x)
{cout << "右值版本" << endl;
}template<class T>
void func1(T&& x)
{func2(x); //预期是调用func2的右值引用版本,但x是左值func2(forward<T>(x));// 使用完美转发,传入右值
}int main()
{func1(1);return 0;
}
运行结果:
这里我们想要将func1的右值引用形参x传给func2,并调用func2的右值引用版本,但是x作为右值引用,语法规定其本身是左值类型,所以直接传入就会调用func2的左值引用版本。完美转发保持了x的右值属性,方便我们正确调用函数。
完美转发的本质是一个函数模板,它基于模板参数T的类型,决定是否使用move将左值转化为右值,从而保持原始参数的值属性,确保不会因为出现左值引用而产生不必要的临时对象拷贝,避免降低效率。
三、类的新默认成员函数
c++11在原有的六个默认成员函数的基础上,新增了两个函数:移动构造函数和移动赋值函数。之前已经提到了它们面对临时对象拷贝时的优势,这里我们再系统介绍一下这两个函数的特点。
1. 移动构造函数
移动构造函数是构造函数的一个重载,类似于拷贝构造函数,主要用于提高临时对象拷贝时的性能。它的特性如下:
1. 移动构造函数的第一个参数必须是该类类型的右值引用,如果还有其他参数,要求这些参数要有缺省值。
2. 如果我们没有显式实现移动构造函数,也没有显式实现析构函数、拷贝构造和赋值重载,那么编译器会默认生成一个移动构造函数。这个自动生成的移动构造函数进行移动构造时,如果遇到内置类型成员,会逐个拷贝;遇到自定义类型的成员,则会调用该成员的移动构造。如果该成员没有移动构造,则会调用其拷贝构造。
//移动构造
string(string&& s)
{swap(s);
}
2. 移动赋值函数
与赋值重载类似,移动赋值对已经存在的对象的赋值,并且会将对方的资源移走。它的特性:
1. 移动赋值必须重载为成员函数,且其第一个参数必须是该类类型的右值引用,一般情况下,将返回值类型设置为该类类型的左值引用,减少拷贝提高效率。
2. 如果我们没有显式实现移动赋值函数,也没有显式实现析构函数、拷贝构造和赋值重载,那么编译器会默认生成一个移动赋值函数。这个自动生成的移动赋值函数进行移动赋值时,如果遇到内置类型成员,会逐个拷贝;遇到自定义类型的成员,则会调用该成员的移动赋值。如果该成员没有移动赋值,则会调用其赋值重载。
//移动赋值
string& operator=(string&& s)
{swap(s);return *this;
}
注意:对于内部需要动态申请资源,要进行资源深拷贝的类,移动构造和移动赋值才有意义,因为移动构造和移动赋值的本质是“窃取”临时对象的资源,而不是像拷贝构造或赋值重载那样去完成资源的深拷贝,这样才能提高效率。
四、lambda表达式
lambda表达式与仿函数类似,是c++11新引入的一种匿名函数对象。与普通函数不同的是,它可以定义在函数体内部。
它的语法格式如下:
[捕捉列表](参数列表)->返回值类型{函数体}
示例:
#include <iostream>
using namespace std;int main()
{//简单的lambda表达式auto f = [](int x, int y)->int {return x + y; };//调用cout << f(1, 2) << endl;return 0;
}
注意:lambda表达式的类型在语法层面是不具体的,所以我们一般用auto或者模板参数定义的对象类型去接收lambda表达式。
这里使用 f 接收lambda表达式以后,我们就可以像调用函数一样调用 f ,并且进行传参。
在定义lambda表达式时,有如下规则需要我们遵守:
1. 捕捉列表的“[ ]”不能省略。
2. lambda表达式的参数为空时,参数列表(包括“( )”)可以省略。
3. 返回值类型(包括“->”)可以省略。
4. 若返回值类型已写,那么就算没有参数,参数列表的“( )”也不能省略。
5. 函数体的“{ }”不能省略。
lambda表达式中的参数列表、返回值类型与函数体都很好理解(与普通函数的含义相同),但是这里的捕捉列表是什么呢?
1. 捕捉列表
就像函数一样,lambda表达式的函数体只能使用其对应参数列表中的变量,无法使用到外部变量。而捕捉列表可以让我们在lambda表达式的函数体当中使用外层变量。
捕捉一共分为三种,分别是显式捕捉、隐式捕捉和混合捕捉。
显式捕捉
显式捕捉就是在捕捉列表当中显式写明要在函数体中使用的变量。示例:
#include <iostream>
using namespace std;int main()
{int a = 1;int b = 3;auto f = [a](int x){//return a + b + x; // 报错,b不能使用return a + x; //捕捉列表中写明了a,可以使用a};cout << f(1) << endl;return 0;
}
当然,如果我们要在函数体内部修改变量a的值,是不允许的(因为这里的a是传值捕捉)。如果要修改a的值,那么需要传引用捕捉:
auto f = [&a](int x) // a前面加一个&
隐式捕捉
相比显式捕捉,隐式捕捉就显得十分便利:它的机制是函数体内部使用了哪些变量就捕捉哪些变量。 隐式捕捉也分为传值捕捉和传引用捕捉:
auto f1 = [=] {}; // 隐式的传值捕捉
auto f2 = [&] {}; // 隐式的传引用捕捉
使用了隐式捕捉之后,我们就可以在函数体内部任意使用外部的变量,编译器会根据我们使用的变量自动捕捉它们。
混合捕捉
如果我们需要在隐式捕捉的基础上,确保其中某些值可以被修改或不能被修改,那么就可以使用混合捕捉。示例如下:
auto f1 = [=, &a] {}; // 其他变量使用传值捕捉,a使用传引用捕捉
auto f2 = [&, a] {}; // 其他变量使用传引用捕捉,a使用传值捕捉
注意:混合捕捉当中,捕捉列表的第一个位置必须是“=”或“&”;如果混合捕捉的隐式部分使用了传值捕捉,那么其他特定变量就不能设置为传值捕捉(没必要),传引用捕捉同上。
捕捉列表的其他要点
1. 全局变量和静态变量不能捕捉,也没必要捕捉,可以直接使用。
2. 对于传值捕捉,其本质是将外层数据进行拷贝,并加上const进行修饰,所以函数体内部没办法修改它。如果想要修改捕捉的值,而不影响外部,可以在参数列表之后,返回值类型之前加上关键字mutable。示例:
#include <iostream>
using namespace std;int main()
{int a = 0;auto f = [=]() mutable ->int //这里的返回值类型可以省略{a++; //可以修改a,且不影响外部的areturn a;};return 0;
}
注意:加上关键字mutable后,那么就算没有参数,参数列表的“( )”也不能省略。
2. lambda表达式的适用场景
在lambda表达式出现之前,可调用对象只有函数指针和仿函数两种,但它们定义起来都比较麻烦。lambda和它们的作用类似,功能也十分强大,在某些场景下编码也会更加方便(因为它是匿名函数对象)。 示例:
sort(a.begin(), a.end(), [](const A& a1, const A& a2){//直接定义排序规则});
除此之外,lambda在线程中定义线程的执行函数逻辑、智能指针的删除器定义等场景中也十分适用。
总结
本篇文章,我们主要学习了c++11的部分新特性:列表初始化、右值引用、类的新默认成员函数和lambda表达式。通过剖析引用折叠、完美转发等底层机制,lambda的多种捕捉方式与适用场景,希望能帮助大家在资源管理、代码简洁性及性能提升之间找到平衡。之后博主会和大家分享c++11其他的新特性,如可变参数模板、包装器、智能指针等。如果你觉得博主讲的还不错,就请留下一个小小的赞在走哦,感谢大家的支持❤❤❤
相关文章:
【c++11】c++11新特性(上)(列表初始化、右值引用和移动语义、类的新默认成员函数、lambda表达式)
🌟🌟作者主页:ephemerals__ 🌟🌟所属专栏:C 目录 前言 一、列表初始化 1. 大括号初始化 2. initializer_list 二、右值引用和移动语义 1. 左值和右值 2. 左值引用和右值引用 引用延长生命周期 左…...
ArcGIS 给大面内小面字段赋值
文章目录 引言:地理数据处理中的自动化赋值为何重要?实现思路模型实现关键点效果实现步骤1、准备数据2、执行3、完成4、效果引言:地理数据处理中的自动化赋值为何重要? 在地理信息系统(GIS)的日常工作中,空间数据的属性字段赋值是高频且关键的操作,例如在土地利用规划…...
计算机网络——传输层(Udp)
udp UDP(User Datagram Protocol,用户数据报协议 )是一种无连接的传输层协议,它在IP协议(互联网协议)之上工作,为应用程序提供了一种发送和接收数据报的基本方式。以下是UDP原理的详细解释&…...
【操作系统(Linux)】——生产者消费者同步互斥模型
✅ 一、程序功能概述 我们将做的:实现一个经典的「生产者-消费者问题」多线程同步模型的案例,主要用到 循环缓冲区 POSIX 信号量 sem_t pthread 多线程库,非常适合理解并发控制、线程通信和缓冲区管理。 案例目标:通过多个生产…...
从数据到洞察:探索数据分析与可视化的高级方法
从数据到洞察:探索数据分析与可视化的高级方法 引言 在今天这个数据驱动的时代,海量的数据只有通过科学分析和清晰可视化,才能转化为商业价值和决策依据。然而,数据分析与可视化远不只是制作几个图表,它需要高级技术、深度洞察力以及良好的工具支持。随着大数据领域的快…...
计算机视觉中的数学:几何变换与矩阵运算详解
计算机视觉中的数学:几何变换与矩阵运算详解 一、前言二、基础数学概念回顾2.1 向量与向量运算2.1.1 向量的定义2.1.2 向量运算 2.2 矩阵基础2.2.1 矩阵的定义与表示2.2.2 矩阵运算 三、几何变换基础3.1 平移变换3.1.1 原理3.1.2 代码示例&…...
华为数字芯片机考2025合集3已校正
1. 题目内容 下列说法正确的是()。 1. 解题步骤 1.1 选项分析 选项描述正误依据A异步 FIFO 采用格雷码是为了省功耗✗格雷码用于消除多比特信号跨时钟域的位跳变风险,与功耗无关B单比特信号打两拍可以完全避免亚稳态✗双触发器同步仅降低…...
启山智软的营销方法有哪些优势?
启山智软作为一家科技或软件企业,其营销方法的优势可能体现在以下几个方面,这些优势结合了行业特点与创新策略,帮助其在竞争激烈的市场中占据有利位置: 1. 技术驱动的精准营销 数据挖掘与AI应用: 通…...
openpyxl合并连续相同元素的单元格
文章目录 前言一、openpyxl是什么?二、基础用法1.读取和写入文件2.合并单元格 三、合并单元格实战1.连续相同元素的索引范围2.转换3.获取列合并索引4.整体 总结 前言 python可以很方便的操作各种文档,比如docx,xlsx等。本文主要介绍在xlsx文…...
从零开始学java--泛型(二)
泛型 目录 泛型 泛型与多态 泛型方法 泛型的界限 泛型与多态 不只是类,包括接口、抽象类都可以支持泛型: public static void main(String[] args) {Score<String> scorenew Score<>("数学","aa","优秀"…...
设计模式 Day 6:深入讲透观察者模式(真实场景 + 回调机制 + 高级理解)
观察者模式(Observer Pattern)是一种设计结构中最实用、最常见的行为模式之一。它的魅力不仅在于简洁的“一对多”事件推送能力,更在于它的解耦能力、模块协作设计、实时响应能力。 本篇作为 Day 6,将带你从理论、底层机制到真实…...
深入理解 Shell:从原理到实战的全方位解析
1. 引言:什么是 Shell? Shell 是操作系统中最基础却最强大的工具之一。它是用户与操作系统之间的接口,一个命令行解释器,它接收用户输入的命令并调用操作系统内核完成相应的操作。 Shell 的含义包括两层: 交互式命令…...
图灵逆向——题六-倚天剑
从第六题开始就要有个先看看请求头的习惯了[doge]。 别问博主为什么要你养成这个习惯,问就是博主被坑过。。。 headers里面有一个加密参数S,然后你就去逆向这个S对吧。 然后一看响应: 好家伙返回的还是个密文,所以要两次逆向咯。…...
【WRF理论第十七期】单向/双向嵌套机制(含namelist.input详细介绍)
WRF运行的单向/双向嵌套机制 准备工作:WRF运行的基本流程namelist.input的详细设置&time_control 设置&domain 嵌套结构&bdy_control 配置部分 namelist 其他注意事项 嵌套说明双向嵌套(two-way nesting)单向嵌套(one…...
【Springboot知识】Springboot进阶-Micrometer指标监控深入解析
文章目录 Micrometer 核心概念与标准指标详解**Micrometer 核心概念与标准指标详解****一、Micrometer 核心概念****二、Micrometer 标准指标****1. JVM 监控指标****2. 系统资源监控****3. HTTP 请求监控****4. 数据库监控****5. 缓存监控** **三、配置与自定义指标****1.…...
Linux 的准备工作
1.root用户登录 首先讲一下root账户怎么登陆 直接 ssh root 公ip地址就可以了 比如我的是腾讯云的 这个就是公ip 下面所有普通用户的操作都是在root账户下进行的 2.普通用户创建 创建用户指令 adduser 用户名 比如说这个指令 我创建了一个ly_centos的普通用户 3.普通用…...
LLM实现模型并行训练:deepspeed 是什么; transformers` 怎么实现模型并行训练吗?
LLM实现模型并行训练:deepspeed 是什么 DeepSpeed是一个由微软开发的深度学习优化库,旨在帮助研究人员和工程师更高效地训练大规模神经网络。它提供了一系列的优化技术,包括混合精度训练、模型并行、数据并行、ZeRO优化等,以提高训练速度、减少内存占用,并支持在多个GPU或…...
STM32 HAL库之EXTI示例代码
外部中断按键控制LED灯 在main.c中 HAL_Init(); 初始化Flash,中断优先级以及HAL_MspInit函数,也就是 stm32f1xx_hal.c 中 HAL_StatusTypeDef HAL_Init(void) {/* Configure Flash prefetch */ #if (PREFETCH_ENABLE ! 0) #if defined(STM32F101x6) || …...
数字人情感表达突破:微表情自动生成的算法革新
——从量子化建模到联邦学习的全链路技术革命 一、行业痛点:传统数字人微表情的“三重困境” 2025年数据显示,83%的虚拟角色因微表情失真导致用户留存率下降(头部游戏公司实测数据)。传统方案面临核心矛盾: 制作成本…...
Django软删除功能完整指南:构建图书馆项目
Django软删除功能完整指南:构建图书馆项目 推荐超级课程: 本地离线DeepSeek AI方案部署实战教程【完全版】Docker快速入门到精通Kubernetes入门到大师通关课AWS云服务快速入门实战目录 Django软删除功能完整指南:构建图书馆项目第 1 步:安装所需包第 2 步:设置您的 Django…...
联邦学习:AI 与大数据融合的创新力量
在当今数字化时代,人工智能(AI)和大数据无疑是推动各行业发展的两大核心技术。AI 凭借其强大的数据分析和预测能力,为企业提供了智能化决策支持;大数据则通过海量数据的收集与存储,为 AI 模型的训练提供了丰…...
idea解决tomcat项目页面中文乱码
概述 解决tomcat项目页面中文乱码问题-Dfile.encodingUTF-8 设置...
Android Coil 3 Fetcher大批量Bitmap拼接成1张扁平宽图,Kotlin
Android Coil 3 Fetcher大批量Bitmap拼接成1张扁平宽图,Kotlin <uses-permission android:name"android.permission.WRITE_EXTERNAL_STORAGE" /><uses-permission android:name"android.permission.READ_EXTERNAL_STORAGE" /><u…...
解锁Midjourney创作潜能:超详细提示词(Prompts)分类指南
AI生图自由!就来 ChatTools (https://chat.chattools.cn),畅享Midjourney免费无限绘画。同时体验GPT-4o、Claude 3.7 Sonnet、DeepSeek等强大模型。 为了帮助大家更好地驾驭Midjourney,我们精心整理并分类了大量常用且效果出众的提示词。无论…...
HBuilder运行uni-app程序报错【Error: listen EACCES: permission denied 0.0.0.0:5173】
一、错误提示: 当使用HBuilder运行uni-app项目的时候提示了如下错误❌ 15:11:03.089 项目 project 开始编译 15:11:04.404 请注意运行模式下,因日志输出、sourcemap 以及未压缩源码等原因,性能和包体积,均不及发行模式。 15:11:04…...
k8s node inode被耗尽如何处理?
当 Kubernetes 节点因 inode 被耗尽导致 Pod 无法调度或运行异常时,需结合 Kubernetes 特性和 Linux 系统管理方法处理。以下是详细步骤: 1. 确认 inode 耗尽 首先登录问题节点,检查 inode 使用率: # 查看全局 inode 使用情况 …...
机器学习之PCA主成分分析详解
文章目录 引言一、PCA的概念二、PCA的基本数学原理2.1 内积与投影2.2 基2.3 基变换2.4 关键问题及优化目标2.5 方差2.6 协方差2.7 协方差矩阵2.8 协方差矩阵对角化 三、PCA执行步骤总结四、PCA参数解释五、代码实现六、PCA的优缺点七、总结 引言 在机器学习领域,我…...
leetcode797图论-对邻接矩阵和邻接表不同形式进行dfs与bfs遍历方法
给你一个有 n 个节点的 有向无环图(DAG),请你找出所有从节点 0 到节点 n-1 的路径并输出(不要求按特定顺序) graph[i] 是一个从节点 i 可以访问的所有节点的列表(即从节点 i 到节点 graph[i][j]存在一条有向…...
Spark核心架构与RDD:大数据处理的基石
Apache Spark作为新一代分布式计算引擎,其高效性和灵活性源于独特的运行架构与核心数据结构RDD。本文简要解析Spark的核心组件及RDD的核心特性,帮助开发者快速理解其设计思想。 一、Spark运行架构 Spark采用标准的**Master-Slave架构,核心组…...
Python Orange:托拉拽玩转机器学习、数据挖掘!
相比写代码做数据挖掘,Python Orange简直是懒人和新手的救星!传统编程得敲一行行代码,调库、debug 累得要死,而Orange靠拖拽就能搞定数据导入、清洗、可视化、建模、评估和无监督学习,支持跨Windows、Mac、Linux平台随…...
K8S学习之基础七十七:istio实现超时功能
istio实现超时功能 模拟客户端调用 nginx,nginx 将请求转发给 tomcat。nginx 服务设置了超时时间为2秒,如果超出这个时间就不在等待,返回超时错误。tomcat服务设置了响应时间延迟10秒,任何请求都需要等待10秒后才能返回。client …...
EFA-YOLO:一种高效轻量的火焰检测模型解析
论文地址:https://arxiv.org/pdf/2409.12635 目录 论文地址:https://arxiv.org/pdf/2409.12635 一、论文结构解析 二、核心创新点解读 1. EAConv(高效注意力卷积) 2. EADown(高效下采样) 三、实验结果对比 1. 精度指标对比 2. 实际检测效果 四、应用场景展望 …...
PyQt6实例_A股财报数据维护工具_解说并数据与完整代码分享
目录 1 20250403之前的财报数据 2 整个项目代码 3 工具使用方法 3.1 通过akshare下载 3.2 增量更新 3.3 查看当前数据情况 3.4 从数据库中下载数据 视频 1 20250403之前的财报数据 通过网盘分享的文件:财报三表数据20250403之前.7z 链接: https://pan.ba…...
【AAOS】【源码分析】CarAudioService(二)-- 功能介绍
汽车音频是 Android 汽车操作系统 (AAOS) 的一项功能,允许车辆播放信息娱乐声音,例如媒体、导航和通信。AAOS 不负责具有严格可用性和时间要求的铃声和警告,因为这些声音通常由车辆的硬件处理。将汽车音频服务集成在汽车中,彻底改变了驾驶体验,为驾驶员和乘客提供了音乐、…...
Python星球日记 - 第18天:小游戏开发(猜数字游戏)
🌟引言: 上一篇:Python星球日记 - 第17天:数据可视化 名人说:路漫漫其修远兮,吾将上下而求索。(屈原《离骚》) 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程…...
ShopXO v2.2.4开源商城手动部署(保姆级)+异常处理
ShopXO v2.2.4开源商城手动部署(保姆级) 1.项目了解 1.1项目简洁 ShopXO国内领先企业级免费开源电商系统! 求实进取、创新专注、自主研发、国内领先企业级电商系统解决方案。遵循MIT开源协议发布,无需授权、可商用、可二次开发、满足99%的电商运营需…...
Android Studio - 解决 Please Select Android SDK
一、出现的问题 点击 Run 后弹窗,图一位置出现图二提示。 二、解决办法 进入 Tools -> SDK Manager,在 Android SDK Location 点击 Edit,一直 Next 就解决了。...
Java 列表初始化全解析:7种方式详解与最佳实践
文章目录 **引言****1. 传统逐个添加元素****特点****注意事项** **2. Arrays.asList() 构造函数****特点****注意事项** **3. 双括号初始化(匿名内部类)****特点****注意事项** **4. Java 9 List.of()(不可变列表)****特点****注…...
python之安装PaddlePaddle和PaddleX解析pdf表格
目录标题 飞桨PaddlePaddle本地安装教程1-1. 基于 Docker 安装飞桨1-2. 基于 pip 安装飞桨2. 我两个环境 都选择的是pip 安装10. 如果报错10. 离线安装 飞桨PaddlePaddle本地安装教程 源码下载:https://github.com/PaddlePaddle/PaddleX/blob/release/3.0-beta1/do…...
MLA(Multi-Level Adaptive)融合算子全院级医疗编程探析(代码版)
MLA(Multi-Level Adaptive)融合算子的AI医疗技术原理、实现方法及医疗应用场景的深度解析: 一、MLA融合算子技术本质 1. 核心设计理念 MLA是一种硬件感知的算子重组技术,通过打破传统深度学习框架的算子边界,实现&a…...
Python----概率论与统计(概率论,互斥事件和概率和,非互斥事件和概率和,独立性事件,生日问题,条件概率)
一、概率论 1.1、概率论 概率论是研究随机现象的一门数学学科。它为不确定性提供了一个量化的框架,允许我们衡量事件发生的可能性。 概率论研究随机现象,用于量化和分析不确定性。它的基本概念包括: 样本空间(Sample Space&…...
Ubuntu24.04 编译 Qt 源码
一:Ubuntu 把 Qt 拆成了多个源码包: 1. 基础包 2. 可选包 二:编译 qtbase-opensource-src 1. 配置源(修改 /etc/apt/sources.list.d/ubuntu.sources) 2. 下载代码 apt source qtbase-opensource-src3. 安装依赖 sudo a…...
数据库无法插入中文字符
INSERT INTO book VALUES (1, ‘楚辞’, ‘屈原’, ‘中国文联出版社’, ‘0’) 1366 - Incorrect string value: ‘\xE6\xA5\x9A\xE8\xBE\x9E’ for column ‘name’ at row 1 查询时间: 0 秒 查看字符集设置 SHOW VARIABLES LIKE character_set%; SHOW VARIABLES LIKE colla…...
在Ubuntu系统如何让MySQL服务器支持远程连接
目录 问题描述 解决方案 步骤一:检查MySQL配置文件 编辑 步骤二:修改bind-address参数 编辑 步骤三:重启MySQL服务 步骤四:验证更改 步骤五:检查防火墙设置 步骤六:测试远程连接 注意事项 …...
【期中准备】电路基础(西电)
电路 题型:填空,简答(概念),计算 PPT 1.X 电压和电流的参考方向一致,称为关联参考方向 消耗功率为正数:负载和电源由功率正负来定义 电路中所有原件功率之和为0(“自产自销”&#…...
mysql 重复读自己事务中可以看到新插入数据
推荐好文 吃透MySQL(六):事务详细介绍 地址转发https://blog.csdn.net/u013277209/article/details/113585022 开启客户端 mysql -u 账号名 -p 输入密码 在一个 事务中 mysql> set session transaction isolation level repeatable…...
Java后端开发-面试总结(集结版)
第一个问题,在 Java 集合框架中,ArrayList和LinkedList有什么区别?在实际应用场景中,应该如何选择使用它们? ArrayList 基于数组,LinkedList 基于双向链表。 在查询方面 ArrayList 效率高,添加…...
Python第八章03:Pyecharts快速入门
# pyecharts快速入门# 一、折线图基础应用# 导入python包 from pyecharts.charts import Line from pyecharts.options import TitleOpts,LegendOpts,ToolboxOpts,VisualMapOpts,TooltipOpts,DataZoomOpts# 创建一个折线图对象 line Line() # 给折线图对象添加x、y轴的数据 l…...
BUUCTF-web刷题篇(17)
26.BabyUpload 源码:https://github.com/imaginiso/GXY_CTF/tree/master/Web/babyupload 查看题目源码: 写着:SetHandler application/x-httpd-php 通过源码可以看出这道文件上传题目主要还是考察.htaccess配置文件的特性,倘若…...
openfga原理及简单落地方案设计
源码地址 https://github.com/openfga OpenFGA 是一款高性能且灵活的授权/许可引擎,专为开发人员打造,灵感来自Google Zanzibar。它将强大的基于关系的访问控制 (ReBAC)和基于属性的访问控制 (ABAC)概念与领域特定语言相结合,可以轻松制定可以扩展和发展到任何规模的任何用例…...