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

C++11(2)

文章目录

  • 右值引用和移动语义在传参中的提效
  • list容器`push_back` & `insert`右值版本的模拟实现
  • 类型分类 (了解即可)
  • 引用折叠
    • 万能引用
  • 完美转发(跟引用折叠有关)

简介:这篇文章是继续介绍C++11的一些新语法知识点,也是对C++11(1)的补充和延续

右值引用和移动语义在传参中的提效

下面是list容器insertpush_back接口实现的右值传参的函数重载,当传入左值时,会去拷贝构造一份该左值插入到容器list中。当传入右值时,会去直接转移该右值的资源,再插入到容器list中,因此便起到了右值引用在传参中的提效只不过要特别注意的一点是,插入的值如果是容器的话,那得支持移动构造

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

// 这个string容器是咱自己实现的,不是库里的string。这样才能看清是拷贝构造,还是移动构造
int main()
{std::list<xiao::string> lt;xiao::string s1("111111111111111111111");lt.push_back(s1);cout << "*************************" << endl;lt.push_back(xiao::string("22222222222222222222222222222"));cout << "*************************" << endl;lt.push_back("3333333333333333333333333333");cout << "*************************" << endl;lt.push_back(move(s1));cout << "*************************" << endl;return 0;
}

在这里插入图片描述

list容器push_back & insert右值版本的模拟实现

这里为了方便更好展现两接口右值版本的模拟实现,需要用到自己实现的list容器,毕竟不只是牵扯到这两个函数这么简单,倒是有点牵一发而动全身的意思下面的list容器只是为了去配合右值版本的模拟实现,并不完整,但够用了

// 没有重载右值版本的list容器
namespace xiao
{template<class T>struct ListNode{ListNode<T>* _next;ListNode<T>* _prev;T _data;ListNode(const T& data = T()):_next(nullptr), _prev(nullptr), _data(data){}};template<class T, class Ref, class Ptr>struct ListIterator{typedef ListNode<T> Node;typedef ListIterator<T, Ref, Ptr> Self;Node* _node;ListIterator(Node* node):_node(node){}Self& operator++(){_node = _node->_next;return *this;}Ref operator*(){return _node->_data;}bool operator!=(const Self& it){return _node != it._node;}};template<class T>class list{typedef ListNode<T> Node;public:typedef ListIterator<T, T&, T*> iterator;typedef ListIterator<T, const T&, const T*> const_iterator;iterator begin(){return iterator(_head->_next);}iterator end(){return iterator(_head);}void empty_init(){_head = new Node();_head->_next = _head;_head->_prev = _head;}list(){empty_init();}void push_back(const T& x){insert(end(), x);}iterator insert(iterator pos, const T& x){Node* cur = pos._node;Node* newnode = new Node(x);Node* prev = cur->_prev;// prev newnode curprev->_next = newnode;newnode->_prev = prev;newnode->_next = cur;cur->_prev = newnode;return iterator(newnode);}private:Node* _head;};
}

这里new出的一个哨兵位结点可以看这个函数empty_init() ,其次为啥这里的析构与上面那副图片的析构不对等?仅仅只是这个list没去写析构函数,这里为了方便阐述右值版本的模拟实现就没写了,但在实际开发中要特别注意,否则会造成严重的资源泄漏

在这里插入图片描述

这里push_back传参是右值的话,就会匹配下面的这个函数,但是之前咱们讲过,这个x它是具有左值属性的,那就不会走下面右值版本的insert,所以需要将这个x进行强转move(x),但当你运行程序后发现还是拷贝构造,是因为insert中的x又退化到了左值,所以需要对这个new Node(x)中的x再进行强转move(x)使它传给下一层是右值

void push_back(T&& x)
{insert(end(), x);// insert(end(),move(x));
}
iterator insert(iterator pos, T&& x)
{Node* cur = pos._node;Node* newnode = new Node(x);//Node* newnode = new Node(move(x));Node* prev = cur->_prev;// prev newnode curprev->_next = newnode;newnode->_prev = prev;newnode->_next = cur;cur->_prev = newnode;return iterator(newnode);
}

但当你执行程序后,仍然是拷贝构造。这也太多坑了吧。这是因为传入的这个右值,结点没有相应的右值构造,仍然走的是const左值引用构造函数。OK,那我再重载一个右值构造函数,但仍然是拷贝构造函数,因为这个_data(data)中的data有退化到左值了,所以需要move(data)

ListNode(const T& data = T()):_next(nullptr), _prev(nullptr), _data(data)
{}
// 这里重载的结点构造函数不能再给缺省值了
// 全缺省的是默认构造,但默认构造函数只能有一个
ListNode(T&& data):_next(nullptr), _prev(nullptr), _data(data)// _data(move(data))
{}

这样一套操作下来就完成了右值引用版本的push_back与insert接口的重载。接下来咱用流程图来清晰的展示向下传值的过程

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

类型分类 (了解即可)

  • C++11以后,进⼀步对类型进⾏了划分,右值被划分纯右值(pure value,简称prvalue)和将亡值(expiring value,简称xvalue)。
  • 纯右值是指那些字⾯值常量或求值结果相当于字⾯值或是⼀个不具名的临时对象。如: 42、true、nullptr 或者类似 str.substr(1, 2),str1 + str2 传值返回函数调⽤,或者整形 a、b,a++,a+b 等。纯右值和将亡值C++11中提出的,C++11中的纯右值概念划分等价C++98中的右值。
  • 将亡值是指返回右值引⽤的函数的调⽤表达式和转换为右值引⽤的转换函数的调⽤表达,如move(x)、static_cast<X&&>(x)
  • 泛左值(generalized value,简称glvalue),泛左值包含将亡值和左值
  • 值类别 - cppreference.com 和 Value categories这两个关于值类型的中⽂和英⽂的官⽅⽂档,有兴趣可以了解细节。

引用折叠

C++中不能直接定义引⽤的引⽤如 int& && r = i; ,这样写会直接报错,通过模板或 typedef中的类型操作可以构成引用的引用。

template<class T>
void f2(T&& x)
{cout << &x << endl;
}int main()
{// 直接对引用的引用会报错int&& a = 2;//int&&& b = a; 是不允许对引用的引用typedef int&& ref; // using ref = int&&;ref& b = a;cout << &b << endl;cout << &a << endl;f2(a); // 打印出来的三个地址是相同的
}

通过模板或 typedef 中的类型操作可以构成引用的引用时,这时C++11给出了⼀个引用折叠的规则:右值引用的右值引用折叠成右值引用,所有其他组合均折叠成左值引用一共具有四种组合,没有为什么,这么去规定是 为了契合某些语法

int main()
{typedef int& lref;typedef int&& rref;int n = 0;lref& r1 = n; // r1 的类型是 int&lref&& r2 = n; // r2 的类型是 int&rref& r3 = n; // r3 的类型是 int&rref&& r4 = 1; // r4 的类型是 int&&return 0;
}

通过这段代码可以去验证,左值引用的其它引用(左值引用或右值引用)永远会被折叠成左值引用,右值引用的右值引用才会被折叠成右值引用

// 由于引⽤折叠限定,f1实例化以后总是⼀个左值引⽤
template<class T>
void f1(T& x)
{}// 由于引用折叠限定,f2实例化后可以是左值引用,也可以是右值引用
template<class T>
void f2(T&& x)
{}int main()
{// 没有折叠->实例化为void f1(int& x)f1<int>(n);f1<int>(0); // 报错// 折叠->实例化为void f1(int& x)f1<int&>(n);f1<int&>(0); // 报错// 折叠->实例化为void f1(int& x)f1<int&&>(n);f1<int&&>(0); // 报错// 折叠->实例化为void f1(const int& x)f1<const int&>(n);f1<const int&>(0);// 折叠->实例化为void f1(const int& x)f1<const int&&>(n);f1<const int&&>(0);// 没有折叠->实例化为void f2(int&& x)f2<int>(n); // 报错f2<int>(0);// 折叠->实例化为void f2(int& x)f2<int&>(n);f2<int&>(0); // 报错// 折叠->实例化为void f2(int&& x)f2<int&&>(n); // 报错f2<int&&>(0);return 0;
}

万能引用

如果该模板函数的参数是右值引用,即template<class T> void f2(T&& x)这个和之前的那个实例化的函数参数的右值引用是不一样的,之前实例化的函数参数x的类型它是确定的,比如(int/double && x)。而模板函数它的类型是不确定的,它会去推导,而又因为引用折叠的规则,就会导致传递左值的时候函数参数是左值引用,传递右值的时候函数参数是右值引用,因此也把这种函数模板的参数称为万能引用

在这里插入图片描述

这里可以这么去理解T推导出来的类型,传参时Function(value)如果value是左值的话,那Function的形参它得是 int t 或者 int& t,那这个T会被推导成啥类型才能配合T&&引用折叠成出上面两种类型呢?value是右值的话,那Function的形参必须得是int&& t,T可能会被推导出int或者int &&,具体是哪种得看函数内部的实现,下面就有个特殊的例子

template<class T>
void Function(T&& t)
{int a = 0;T x = a;x++;cout << &a << endl;cout << &x << endl << endl;
}
int main()
{// 10是右值,推导出T为int,模板实例化为void Function(int&& t)Function(10); // 右值int a;// a是左值,推导出T为int&,引⽤折叠,模板实例化为void Function(int& t)Function(a); // 左值// std::move(a)是右值,推导出T为int,模板实例化为void Function(int&& t)Function(std::move(a)); // 右值const int b = 8;// b是左值,推导出T为const int&,引⽤折叠,模板实例化为void Function(const int&t)// 所以Function内部会编译报错,x不能++Function(b); // const 左值// std::move(b)右值,推导出T为const int,模板实例化为void Function(const int&&t)// 所以Function内部会编译报错,x不能++Function(std::move(b)); // const 右值return 0;
}

下面的这段代码可能会存在疑问,为啥这个T推导出来是int而不是int &&呢?T &&,当T为int &&的时候照样会被折叠成右值引用啊(右值引用的右值引用才会被折叠成右值引用)。是没问题的,但载函数中 int a = 0; T x = a;当T为int &&时,变量x无法去作变量a的别名,因为a是一个左值

// std::move(a)是右值,推导出T为int,模板实例化为void Function(int&& t)
Function(std::move(a)); // 右值

完美转发(跟引用折叠有关)

完美转发是什么意思?为啥跟引用折叠有关?需要去解决一个什么样的问题

  1. 完美转发它本质上就是一个函数模板,forward
lvalue (1)	
template <class T> T&& forward (typename remove_reference<T>::type& arg) noexcept;
rvalue (2)	
template <class T> T&& forward (typename remove_reference<T>::type&& arg) noexcept;
  1. 为啥跟引用折叠有关,需要去解决一个什么样的问题
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<class T>
void Function(T&& t)
{Fun(t);
}
int main()
{// 10是右值,推导出T为int,模板实例化为void Function(int&& t)Function(10); // 右值int a;// a是左值,推导出T为int&,引⽤折叠,模板实例化为void Function(int& t)Function(a); // 左值// std::move(a)是右值,推导出T为int,模板实例化为void Function(int&& t)Function(std::move(a)); // 右值const int b = 8;// a是左值,推导出T为const int&,引⽤折叠,模板实例化为void Function(const int&t)Function(b); // const 左值// std::move(b)右值,推导出T为const int,模板实例化为void Function(const int&&t)Function(std::move(b)); // const 右值return 0;
}

上面的代码它重载了四个Fun函数,我们在main函数中往Function函数中传入左值或右值,那该模板函数就会发生引用折叠,此时参数t就会产生不同的类型(int&,int&&,const int&等)。那就需要各自类型的参数t去匹配不同的Fun函数,可是当我们去运行代码后,发现咱都是跟左值引用相关的啊!

在这里插入图片描述

这个问题咱也遇到了很多次了,无论这个t的类型是左值引用还是右值引用,左值引用(int& t)它的属性是左值,右值引用(int&& t)它的属性会退化成左值属性,因此都全部走左值引用的Fun函数了。那如果用move(t)强转呢?首先这个t的类型是编译器根据传入的值去引用折叠推导,咱也不知道那个是左值就给它强转成右值啊,你直接move那就全部走右值引用的Fun函数了所以强转也无法解决问题,因此就用到完美转发 forward<T>(t)

你这个t的类型是int&&,t的属性退化成左值,那就给你强转成右值,t的类型是int&,那就给你强转成左值。它的底层本质上还是强转,只不过它会去判断,无需咱们操心

Fun(forward<T>(t));

相关文章:

C++11(2)

文章目录 右值引用和移动语义在传参中的提效list容器push_back & insert右值版本的模拟实现类型分类 (了解即可&#xff09;引用折叠万能引用 完美转发&#xff08;跟引用折叠有关&#xff09; 简介&#xff1a;这篇文章是继续介绍C11的一些新语法知识点&#xff0c;也是对…...

unity terrain 在生成草,树,石头等地形障碍的时候,无法触发碰撞导致人物穿过模型

1.terrain地形的草&#xff0c;石头之类要选择模型预制体 2.在人物身上挂碰撞器和刚体&#xff0c;或者单挂一个character controller组件也行 3.在预制体上挂碰撞盒就好了&#xff0c;挂载meshcollider会导致碰撞无效...

以项目的方式学QT开发C++(二)——超详细讲解(120000多字详细讲解,涵盖qt大量知识)逐步更新!

API 描述 函数原型 参数说明 push_back() 在 list 尾部 添加一个元素 void push_back(const T& value); value &#xff1a;要添 加到尾部的元 素 这个示例演示了如何创建 std::list 容器&#xff0c;并对其进行插入、删除和迭代操作。在实际应用中&am…...

养生:健康生活的极简攻略

在追求高效生活的当下&#xff0c;养生也能化繁为简。通过饮食、运动、睡眠与心态的精准调节&#xff0c;就能轻松为健康续航。 饮食上&#xff0c;遵循 “均衡、节制” 原则。早餐用一杯热豆浆搭配水煮蛋和半个苹果&#xff0c;唤醒肠胃活力&#xff1b;午餐以糙米饭为主食&am…...

C语言-8.数组

8.1数组 8.1.1初试数组 如何写一个程序计算用户输入的数字的平均数? #include<stdio.h> int main() {int digit;//输入要求平均数的数字double sum=0;//记录输入数字的和int count=0;//记录输入数字的个数printf("请输入一组数字,用来求平均数,以-1结束\n&quo…...

代码随想录算法训练营第四十一天

LeetCode题目: 739. 每日温度496. 下一个更大元素 I503. 下一个更大元素 II 其他: 今日总结 往期打卡 739. 每日温度 跳转: 739. 每日温度 学习: 代码随想录公开讲解 问题: 给定一个整数数组 temperatures &#xff0c;表示每天的温度&#xff0c;返回一个数组 answer &…...

c++,windows,多线程编程详细介绍

目录 一、C11 标准库 <thread> 实现多线程编程1. 基本线程创建2. 线程管理3. 线程传参4. 同步机制5. 异步编程 二、Windows API 实现多线程编程1. 基本线程创建2. 线程管理3. 线程传参 三、两种方法的对比 在 Windows 平台上使用 C 进行多线程编程&#xff0c;可以通过 C…...

Python多线程

Python多线程 作为一名Python开发者&#xff0c;你是否遇到过这样的场景&#xff1a;程序需要同时处理多个任务&#xff0c;但单线程执行效率太低&#xff1f;这时候&#xff0c;多线程技术就能派上用场了。本文将带你深入浅出地理解Python多线程&#xff0c;并通过丰富的示例…...

VisionPro斑点寻找工具Blob

斑点寻找工具Blob 斑点概述 斑点分析 探测并且分析图像中的二维形状Blob是先根据用户设定好的灰阶范围对图像进行分割&#xff0c;然后对目标进行查找和分析。斑点报告多种属性&#xff1a; 面积质心周长主轴…….. 应用场景 Blob分析非常适合以下场合的应用&#xff1a; 对…...

【Python】【面试凉经】Fastapi为什么Fast

核心的关键词&#xff1a;ASGI、原生异步、协程、uvloop、异步生态、Pydantic编译时生成校验代码、DI system预计算依赖树 interviewer 00:32:49 FastAPI 它优越于其他一些主流web框架像 django或 flask 的这个点在哪里&#xff1f; 我 00:33:00fastapi 就是说它的 fast 性能高…...

LocalDateTime类型的时间在前端页面不显示或者修改数据时因为LocalDateTime导致无法修改,解决方案

1.数据库中的时间数据&#xff0c;在控制台可以正常返回&#xff0c;在前端无法返回&#xff0c;即显示空白&#xff0c;如下图所示: 2.这种问题一般时由于数据库和我们实体类的名称不一致引起的&#xff0c;我们数据库一般采用_的方式命名&#xff0c;但是在Java中我们一般采用…...

【Linux】gcc从源码编译安装,修改源码,验证修改的源码

前阵子电脑使用的win10&#xff0c;win10过几天就让升级&#xff0c;烦得不行。 然后把操作系统切换到ubuntu24的样子,然后也是让升级&#xff0c;又烦的不行&#xff0c;然后切换到ubuntu server版本&#xff0c;感觉用起来要舒服些了&#xff0c;至少不会天天让升级。 回到标…...

牛客网NC22157:牛牛学数列2

牛客网NC22157:牛牛学数列2 &#x1f4dd; 题目描述 &#x1f50d; 输入输出说明 输入描述&#xff1a; 输入一个整数 N&#xff0c;范围在 0 到 1000 输出描述&#xff1a; 输出一个保留6位小数的浮点数 示例&#xff1a; 输入&#xff1a;2输出&#xff1a;1.500000 …...

智能手表集成测试报告(Integration Test Report)

&#x1f4c4; 智能手表集成测试报告&#xff08;Integration Test Report&#xff09; 项目名称&#xff1a;Aurora Watch S1 测试阶段&#xff1a;系统集成测试 测试周期&#xff1a;2025年xx月xx日 – 2025年xx月xx日 报告编号&#xff1a;AW-S1-ITR-2025-001 版本&#xf…...

1C:ENTERPRISE 8.3 实用开发者指南-示例和标准技术(Session1-Session3)

1C:ENTERPRISE 8.3&#xff08;1课-3课&#xff09; 本博客是全网首个关于1C:Enterprice的中文指南&#xff0c;支持快速吸收使用 1C:Enterprise 8.3 软件开发和调整应用程序的技术 在这篇博客中我会基于实际应用示例&#xff0c;演示各种系统对象的结构、功能和用法。使用内…...

AgenticSeek开源的完全本地的 Manus AI。无需 API,享受一个自主代理,它可以思考、浏览 Web 和编码,只需支付电费。

​一、软件介绍 文末提供程序和源码下载 AgenticSeek开源的完全本地的 Manus AI。无需 API&#xff0c;享受一个自主代理&#xff0c;它可以思考、浏览 Web 和编码&#xff0c;只需支付电费。这款支持语音的 AI 助手是 Manus AI 的 100% 本地替代品 &#xff0c;可自主浏览网页…...

Java类一文分解:JavaBean,工具类,测试类的深度剖析

解锁Java类的神秘面纱&#xff1a;从JavaBean到测试类的深度剖析 前言一、JavaBean 类&#xff1a;数据的守护者&#xff08;一&#xff09;JavaBean 类是什么&#xff08;二&#xff09;JavaBean 类的特征&#xff08;三&#xff09;JavaBean 类的使用场景&#xff08;四&…...

2025认证杯数学建模第二阶段C题:化工厂生产流程的预测和控制,思路+模型+代码

2025认证杯数学建模第二阶段思路模型代码&#xff0c;详细内容见文末名片 一、探秘化工世界&#xff1a;问题背景大揭秘 在 2025 年 “认证杯”数学中国数学建模网络挑战赛第二阶段 C 题中&#xff0c;我们一头扎进了神秘又复杂的化工厂生产流程预测与控制领域。想象一下&…...

day 17 无监督学习之聚类算法

一、聚类流程 1. 利用聚类发现数据模式 无监督算法中的聚类&#xff0c;目的就是将数据点划分成不同的组或 “簇”&#xff0c;使得同一簇内的数据点相似度较高&#xff0c;而不同簇的数据点相似度较低&#xff0c;从而发现数据中隐藏的模式。 2. 对聚类后的类别特征进行可视…...

渗透测试流程-上篇

#作者&#xff1a;允砸儿 #日期&#xff1a;乙巳青蛇年 四月十八 本期就开始进入到网安的内容了笔者会和大家一起开始实操练习。在此之前笔者的老师和我说要知己知彼&#xff0c;胆大心细。笔者也把他的理念传出去&#xff0c;网安的知识比较复杂且使用的工具很多。笔者看过…...

Ubuntu离线安装Minio

MinIO 支持在 Linux 环境下离线安装&#xff0c;非常适合内网或无法联网的服务器环境。下面是详细的 Linux 离线安装 MinIO 服务端 的步骤&#xff1a; ✅ 一、准备工作 1. 创建安装目录&#xff08;可选&#xff09; mkdir -p /opt/minio cd /opt/minio2. 下载 MinIO 可执行…...

2025年山东省数学建模F题思路

2025年山东省数学建模F题思路 一、问题背景 在现代金融市场中&#xff0c;资产价格波动呈现出非线性、高噪声、强跨市场联动性等复杂动态特征。例如&#xff0c;2020年新冠疫情期间&#xff0c;美股数次熔断事件引发全球股市剧烈震荡&#xff1b;而2023年美元加息周期&#x…...

C++核心编程--3 函数提高

函数的一些高级用法。 3.1 函数形参默认值 C中&#xff0c;函数的形参可以有默认值&#xff0c;调用函数时&#xff0c;未进行赋值的形参会使用默认值 void func(int f_var1 10, int f_var2 20); // 声明 ​ void func(int f_var1, int f_var2) // 定义 {std::cout <&l…...

AI Agent开发第67课-彻底消除RAG知识库幻觉(1)-文档分块全技巧

开篇 在上篇《AI Agent开发第66课-彻底消除RAG知识库幻觉-带推理的RAG》放出后,网友们反响很大。有得告诉我:原来还有Rewrite这么一招?早知道这一招很多之前的一些遗留问题都能解决了。不过在上一篇结尾我已经提到了,要真正解决一个AI Agent在响应时产生的幻觉我们用提示语…...

c++多态面试题之(析构函数与虚函数)

有以下问题展开 析构函数要不要定义成虚函数&#xff1f;基类的析构函数要不要定义成虚函数&#xff1f;如果不定义会有什么问题&#xff0c;定义了在什么场景下起作用。 1. 基类析构函数何时必须定义为虚函数&#xff1f; 当且仅当通过基类指针&#xff08;或引用&#xff09;…...

buildroot使用外部编译链编译bluez蓝牙工具

buildroot使用外部编译链编译bluez蓝牙工具 主要参见这个csdn buildroot使用外部编译链编译bluez蓝牙工具_bluez编译-CSDN博客 设置交叉编译工具路径时&#xff0c;设置到bin目录之前 如果menuconfig不能改路径&#xff0c;就去 .config下去改 这样才能编译过...

自定义类型:结构体

1.结构体类型的声明 1.1.1结构的声明 struct tag {member-list; }variable-list; 描述一个学生&#xff1a;只包含了学生的名字、年龄、性别、学号 struct Stu {char name[20];//名字int age;//年龄char sex[5];//性别char id[20];//学号 }; 1.1.2 结构体变量的创建和初始…...

以项目的方式学QT开发C++(一)——超详细讲解(120000多字详细讲解,涵盖qt大量知识)逐步更新!

以项目的方式学QT开发 以项目的方式学QT开发 P1 QT介绍 1.1 QT简介 1.2 QT安装 1.2.1 Windows QT安装 1.2.2 QT Creator 使用基本介绍 P2 C基础 2.1 命名空间 2.1.1 命名空间作用 2.1.2 自定义命名空间 2.2 从C语言快速入门 2.2.1 输入输出 2.2.2 基…...

Spring框架的事务管理

引言 在企业级应用开发中&#xff0c;事务管理是一个至关重要的环节&#xff0c;它确保了数据的一致性和完整性。Spring 框架为我们提供了强大而灵活的事务管理功能&#xff0c;能够帮助开发者更轻松地处理复杂的事务场景。本文将深入探讨 Spring 框架的事务管理&#xff0c;包…...

TypeScript:类

一、基本概念 TypeScript 类是基于 ES6 类的语法扩展&#xff0c;增加了类型注解和访问修饰符等特性&#xff0c;提供了更强大的面向对象编程能力。 二、基本语法 class Person {name: string;age: number;constructor(name: string, age: number) {this.name name;this.ag…...

Python继承

在Python编程中&#xff0c;继承是一个让新手又爱又怕的概念。今天我们就来聊聊这个看似高深实则简单的特性&#xff0c;保证让你看完后能拍着胸脯说&#xff1a;“继承嘛&#xff0c;小菜一碟&#xff01;” 一、什么是继承&#xff1f; 想象一下你正在玩一个养成游戏。你创…...

浏览器宝塔访问不了给的面板地址

注意你们的端口&#xff0c;服务器的端口开放了没&#xff01;&#xff01;&#xff01;宝塔给的端口是否在范围之内&#xff01;&#xff01; 我的当时是1000/10000 &#xff08;阿里云服务器&#xff09; 但是宝塔给的是 4W多 对不上&#xff01;&#xff01; 更换安全组…...

强化学习入门:马尔科夫奖励过程

文章目录 前言1、组成部分2、应用例子3、马尔科夫奖励过程总结 前言 最近想开一个关于强化学习专栏&#xff0c;因为DeepSeek-R1很火&#xff0c;但本人对于LLM连门都没入。因此&#xff0c;只是记录一些类似的读书笔记&#xff0c;内容不深&#xff0c;大多数只是一些概念的东…...

RHCE实验:通过脚本判断用户是否存在

一、实验要求 1、 写一个脚本&#xff0c;使用函数完成 1 、函数能够接受一个参数&#xff0c;参数为用户名&#xff1b; 判断一个用户是否存在 如果存在&#xff0c; 就返回此用户的 shell 和 UID &#xff1b;并返回正常状态值&#xff1b; 如果不存在&#xff0c;就说此用…...

Windows软件插件-音视频捕获

下载本插件 音视频捕获就是获取电脑外接的话筒&#xff0c;摄像头&#xff0c;或线路输入的音频和视频。 本插件捕获电脑外接的音频和视频。最多可以同时获取4个视频源和4个音频源。插件可以在win32和MFC程序中使用。 使用方法 首先&#xff0c;加载本“捕获”DLL&#xff0c…...

每日算法 - 【Swift 算法】Two Sum 问题:从暴力解法到最优解法的演进

【Swift 算法】Two Sum 问题&#xff1a;从暴力解法到最优解法的演进 本文通过“Two Sum”问题&#xff0c;带你了解如何从最直观的暴力解法&#xff0c;逐步优化到高效的哈希表解法&#xff0c;并对两者进行对比&#xff0c;适合算法入门和面试准备。 &#x1f4a1; 问题描述 …...

2025年,如何制作并部署一个完整的个人博客网站

欢迎访问我的个人博客网站&#xff1a;欢迎来到Turnin的个人博客 github开源地址&#xff1a;https://github.com/Re-restart/my_website 前言 2024年年初&#xff0c;从dji实习回来之后&#xff0c;我一直想着拓宽自己的知识边界。在那里我发现虽然大家不用java&#xff0c;…...

深度学习框架---TensorFlow概览

一、TensorFlow 概述 1. 发展历程 1.x 版本&#xff1a;基于静态图&#xff08;Graph&#xff09;和会话&#xff08;Session&#xff09;&#xff0c;需预先定义计算图&#xff0c;调试较复杂。2.x 版本&#xff1a;默认启用动态图&#xff08;Eager Execution&#xff09;&…...

鸿蒙OSUniApp制作自定义的下拉菜单组件(鸿蒙系统适配版)#三方框架 #Uniapp

UniApp制作自定义的下拉菜单组件&#xff08;鸿蒙系统适配版&#xff09; 前言 在移动应用开发中&#xff0c;下拉菜单是一个常见且实用的交互组件&#xff0c;它能在有限的屏幕空间内展示更多的选项。虽然各种UI框架都提供了下拉菜单组件&#xff0c;但在一些特定场景下&…...

扣子(Coze)案例:工作流生成小红书心理学卡片

大家好&#xff01;我是 Robin。专注于 AI 技术探索与实践&#xff0c;持续分享 Coze 智能体、Coze 模板&#xff0c;以及 Coze 工作流搭建案例。 工作流智能体作用&#xff1a; 输入需要生成小红书心理学知识卡片的数量&#xff0c;工作流自动批量生成图文。 首先演示一下生…...

深度理解用于多智能体强化学习的单调价值函数分解QMIX算法:基于python从零实现

引言&#xff1a;合作式多智能体强化学习与功劳分配 在合作式多智能体强化学习&#xff08;MARL&#xff09;中&#xff0c;多个智能体携手合作&#xff0c;共同达成一个目标&#xff0c;通常会收到一个团队共享的奖励。在这种场景下&#xff0c;一个关键的挑战就是功劳分配&a…...

C语言经典笔试题目分析(持续更新)

1. 描述下面代码中两个static 各自的含义 static void func (void) {static unsigned int i; }static void func(void) 中的 static 作用对象&#xff1a;函数 func。 含义&#xff1a; 限制函数的作用域&#xff08;链接属性&#xff09;&#xff0c;使其仅在当前源文件&…...

射击游戏demo11

完善地图&#xff0c;加载出装饰品&#xff0c;检测人员与地面的碰撞&#xff0c;检测子弹与岩壁的碰撞&#xff0c;检测手雷与地面的碰撞。 import pygame import sys import os import random import csv # 初始化Pygame pygame.init()# 屏幕宽度 SCREEN_WIDTH 1200 # 屏幕高…...

多智能体Multi-Agent应用实战与原理分析

一:Agent 与传统工具调用的对比 在当今的开发环境中,Agent 的出现极大地简化了工作流程。其底层主要基于提示词、模型和工具。用户只需向 Agent 输入需求,Agent 便会自动分析需求,并利用工具获取最终答案。而传统方式下,若没有 Agent,我们则需要手动编码来执行工具,还要…...

专项智能练习(定义判断)_DA_01

1. 单选题 热传导是介质内无宏观运动时的传热现象&#xff0c;其在固体、液体和气体中均可发生。但严格而言&#xff0c;只有在固体中才是纯粹的热传导&#xff0c;在流体&#xff08;泛指液体和气体&#xff09;中又是另外一种情况&#xff0c;流体即使处于静止状态&#xff0…...

关于NLP自然语言处理的简单总结

参考&#xff1a; 什么是自然语言处理&#xff1f;看这篇文章就够了&#xff01; - 知乎 (zhihu.com) 所谓自然语言理解&#xff0c;就是研究如何让机器能够理解我们人类的语言并给出一些回应。 自然语言处理&#xff08;Natural Language Processing&#xff0c;NLP&#xff0…...

SLAM定位与地图构建

SLAM介绍 SLAM全称Simultaneous Localization And Mapping&#xff0c;中文名称同时定位与地图构建。旨在让移动设备在未知环境中同时完成以下两个任务&#xff08;定位需要地图&#xff0c;而建图又依赖定位信息&#xff0c;两者互为依赖&#xff09;&#xff1a; 定位&#…...

REST架构风格介绍

一.REST&#xff08;表述性状态转移&#xff09; 1.定义 REST&#xff08;Representational State Transfer&#xff09;是由 Roy Fielding 在 2000 年提出的一种软件架构风格&#xff0c;用于设计网络应用的通信模式。它基于 HTTP 协议&#xff0c;强调通过统一的接口&#…...

前端流行框架Vue3教程:16. 组件事件配合`v-model`使用

组件事件配合v-model使用 如果是用户输入&#xff0c;我们希望在获取数据的同时发送数据配合v-model 来使用&#xff0c;帮助理解组件间的通信和数据绑定。 &#x1f9e9; 第一步&#xff1a;创建子组件&#xff08;SearchComponent.vue&#xff09; 这个组件用于处理用户的搜…...

5月15日day26打卡

函数专题1 知识点回顾&#xff1a; 函数的定义变量作用域&#xff1a;局部变量和全局变量函数的参数类型&#xff1a;位置参数、默认参数、不定参数传递参数的手段&#xff1a;关键词参数传递参数的顺序&#xff1a;同时出现三种参数类型时 作业&#xff1a; 题目1&#xff1a;…...