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

C++11新特性

目录

引入

C++11新特性

统一的初始化列表

一切皆可{}初始化

std::initializer_list

统一的声明

auto

decltype

nullptr

范围for

STL新增容器

STL新增容器接口

左值引用和右值引用

左值和右值

左值引用和右值引用

右值引用的优势(移动语义)

右值引用的使用场景

move谨慎使用

模板中的万能引用

完美转发

类型转换

C++类型转化

static_cast

reinterpret_cast

const_cast

dynamic_cast


引入

C++11是C++的一个大变革,增加了大约有140种新特性,其中有不少对于我们的代码编写效率帮助很大,也有一些特性很鸡肋;C++11是委员会经过了8年积淀才发行的,其中添了不少C++的“坑”,此篇文章将对C++11的新特性进行介绍和剖析。

C++11新特性

统一的初始化列表

一切皆可{}初始化

C++98规定了可以使用{}对内置类型或结构体元素进行初始化,在C++11后将{}的适用范围进行了扩充,允许{}对所有内置类型和自定义类型进行初始化,并且如果使用{}进行初始化可以不加赋值符号=。

struct Point
{int x;int y;
};int a = 1;
int a1 = { 1 };
int a2{ 1 };int arr[]{ 1,2,3,4 };Point p1 = { 1,1 };
Point p2{ 1,1 };

以上初始化的方式都是被允许的。

std::initializer_list

initializer_list是C++中引入的一个新特性,其保证了一切皆可{}初始化。可以理解为代码中的{}会被识别为initializer_list类型,然后通过该类型再去进行赋值或构造

为了验证{}的类型是initializer_list类型,可以使用typeid(e).name()来打印类型。

auto e = { 1,2,3,4,5,6,7 };
cout << typeid(e).name() << endl;

C++11为每个容器的构造函数都增加了用initializer_list作为参数进行构造,这也是为什么容器可以使用{}进行初始化。

vector:

set:

map:

对于自定义类型用{}进行初始化,以及vector用{}进行初始化的原理是不一样的,vector的{}中元素个数是可以不固定的,而对于一些我们自己实现的自定义类型的{}中元素的个数是固定的;比如一下Point类型。

struct Point
{int x;int y;
};Point p1 = { 1,1 };
vector<int> v={1,2,3,4,5,6,7};

p1的{}是隐式类型转化,先用{}中的参数进行构造Point对象,再进行拷贝构造,编译器会将两次构造优化为一次;v是用initialiter_list进行构造的,不是使用拷贝构造。


统一的声明

auto

C++11对auto的作用进行了修改,auto可以实现类型推断,变量的类型需要显示的写,让编译器自己推。

不论是内置类型,自定义类型,还是函数返回值auto都能推导。但是注意:auto不能作为函数的参数。 

auto a = new int(1);
auto b = &a;
auto c = strcpy;

decltype

decltype(expression)

decltype是C++11中新增的关键字,其能够获得表达式的类型。表达式可以是变量,也可以是表达式。

decltype(&x) aa;  //aa的类型是int*
decltype(x * y) bb; //bb的类型是doouble

nullptr

C++11引入了nullptr来代替NULL;NULL实际上是0,是整形,这也就导致了在进行函数传参的时候NULL会匹配整形而不是指针。引入nullptr就不会出现分歧了,nullptr本质是(void*)0


范围for

C++引入范围for这一新概念,对于数组以及部分容器的遍历的方式进行了简化。

int arr[] = { 1,2,3,4,5,6,7 };
for (auto e : arr)
{cout << e << endl;
}vector<int> v = { 1,2,3,4,5,6,7,8,8 };
for (auto e : v)
{cout << e << endl;
}

范围for的底层还是依靠迭代器来实现的,所以没有实现迭代器的容器是不能使用范围for的。


STL新增容器

以上用红色框起来的都是新增容器,其中unordered_set和unordered_map底层是哈希表,关于哈希表的底层实现在《哈希表的实现》中已经进行了深度剖析,此处就不再赘述了。

哈希表(闭散列)的实现-CSDN博客文章浏览阅读921次,点赞43次,收藏44次。通过除留余数法确定数据位置,再根据闭散列的方法解决哈希冲突。本篇博客对哈希表闭散列的实现进行细致剖析,帮助读者理解哈希表性能的优缺点。 https://blog.csdn.net/2401_87944878/article/details/146922720哈希表(开散列)的实现-CSDN博客文章浏览阅读518次,点赞24次,收藏26次。通过除留余数法确定数据位置,再根据开散列的方法解决哈希冲突。本篇博客对哈希表开散列的实现进行细致剖析,帮助读者理解哈希表性能的优缺点。 https://blog.csdn.net/2401_87944878/article/details/146923387array容器,其底层就是数组,只是对数组进行了封装。

int arr1[10] = { 0 };
array<int, 10> a2{ 0 };

以上arr1和arr2是完全一样的,唯一区别就是array对越界的检查更加严格,这个类在我们实际写代码中用的很少,没有数组的简洁,直观,也没有vector丰富的接口,array的使用很鸡肋。

forward_list容器,其底层是单链表,这个容器也很鸡肋,库中forward_list不支持尾插和任意位置前面插入,因为这两个函数实现的时间复杂度是O(N);forward_list的使用不如list,所以这个容器的使用也是比较少的。

STL新增容器接口

C++11为每个容器的迭代器增加了新接口:cbegin()和cend();

这俩个接口专门用来返回const迭代器,但是begin()中已经重载了返回const迭代器的接口,所以cbegin和cend的引入是完全没有必要的。


左值引用和右值引用

左值和右值

C++11引入了左值和右值的概念;

左值:可以获取地址的值被称为左值,左值可以在赋值符号=的左边也可以在右边;

右值:不能获取地址的值被称为右值,右值只能在赋值符号=的右边;右值通常有常量,表达式,函数返回值...

例外:常量字符串属于左值,其可以取地址。

const char* arr = "hello world";

左值引用和右值引用

我们通常使用的都是左值引用。

左值引用:在类型后加&即可。

int a = 10;
int& b = a;
int* p = new int(1);
int*& pp = p;

右值引用:在类型后加&&即可。

double x = 1.8, y = 2.3;
double&& sum = x + y;

左值引用可以引用右值:使用const&;

const int& a1 = 10;
double x = 1.8, y = 2.3;
const double& sum = x + y;

右值引用可以引用左值:move()仿函数,将左值转化为右值;

double x = 1.8, y = 2.3;
double&& x1 = move(x);
double&& y1 = move(y);

右值引用的优势(移动语义)

右值引用作为参数和返回值可以提高效率。

当需要将一个自定义类型的对象返回并接受的时候,使用右值引用可以减少拷贝。

以上代码编译器会优化:将ret视为右值,因为其是将亡值,即将被销毁。 

根据以上图可以看出,如果对自定义类型进行返回的时候会先进行拷贝再去赋值。

上面代码中返回的ret即将被销毁,所以ret也被称为将亡值。ret是将亡值,能否直接用ret来进行赋值呢??不去创建临时对象,这样也能大大提高效率。

此时就可以使用右值引用,通过引用将亡值来避免再创建临时对象,而是直接进行赋值,这也种方法被称为移动赋值。

对赋值函数进行重载即可,将参数修改为右值引用,代码模拟实现如下。

//赋值重载函数
string& operator=(const string& s)
{cout << "赋值" << endl;string tmp(s);swap(tmp);return *this;
}//移动赋值
string& operator=(string&& s)
{cout << "移动赋值" << endl;swap(s);return *this;
}

有移动赋值,同时也有移动构造。

//拷贝构造
string(const string& s):_str(nullptr)
{cout << "深拷贝" << endl;string tmp(s._str);swap(tmp);
}//移动拷贝构造
string(string&& s):_str(nullptr)
{cout << "移动拷贝" << endl;swap(s);
}

左值引用的核心是:减少拷贝,提高效率;

右值引用的核心是:进一步减少拷贝,解决左值引用没有解决的传值返回问题。

右值引用的使用场景

自定义类型中需要深拷贝的类,且有对该类型进行船只返回的场景。

浅拷贝的类不需要实现移动语义,编译器会自动生成;而且浅拷贝的拷贝代价也不大,没有意义。

右值引用的核心在于:不进行深拷贝,而是进行已有资源的交换。

库中的容器里,基本上每一个插入,构造,赋值都会重载移动语义来提高效率; 

move谨慎使用

库中会对移动语义进行重载,那使用move将左值变为右值不就可以提高效率吗??

理论上是这样的,但是被move且被使用的参数会自动销毁。

string s1 = "hello";
vector<string> l;
l.push_back(move(s1));

以上代码,确实提高了list插入的效率,但是插入后,s1会调用析构函数。


模板中的万能引用

template<typename T>
void Func(T&& val)
{cout << val << endl;
}

模板中的&&并不仅仅表示右值引用,其表示万能引用,既可以引用左值又能引用右值。

实参是左值,T&&实例化成左值引用,这一现象称为折叠;

实参是右值,T&&实例化成右值引用。

万能引用也包含const 引用。


完美转发

在C++11中规定了:右值引用变量的属性会被编译器识别为左值。

void Func1(int&& val)
{cout << val << endl;
}

意思就是,上面代码中的val不再是右值,而是左值。

如果希望保持val的右值属性,在使用val的时候,使用forward<T>(val)替代,这样向下一个函数传递的时候依旧保留的右值的属性。

完美转化常用于:在多个函数之间相互调用的时候,需要保留参数的右值属性。

比如:在list的插入中,如果传过去的是右值属性的自定义类型,进行构造的时候还需要保持其右值属性,此时就可以使用完美转化来实现。

//尾插
void push_back(T&& val)
{ListNode* newnode = new ListNode(std::forward<T>(val));newnode->_next = _phead;newnode->_prev = _phead->_prev;_phead->_prev->_next = newnode;_phead->_prev = newnode;
}

对ListNode进行构造时,仍然需要保留右值属性,从而调用string的移动构造。

//初始化节点
ListNode(T&& val):_val(std::forward<T>(val)), _next(this), _prev(this)
{}

tips:只要是右值变量需要往下传,且要保留右值属性就可以使用完美转发来实现。

类型转换

类型转换分为显式类型转化和隐式类型转化。

1)有关联的类型之间可以转化;

2)指针可以转为整形,地址也只是一个编号;

3)单参数构造支持隐式类型转化;

4)自定义类型能否隐式类型转换看构造函数,如果不希望进行隐式类型转化可使用explict进行修饰。

void test_07()
{const int a = 10;const int* pa = &a;int* paa = (int*)pa;*(paa) = 20;cout << *paa << endl;cout << a << endl;
}

上图是对const类型进行隐式类型转化,来实现对const类型变量的修改。

如图是代码运行的结果,并没有看到a发生了改变。这是因为a实际上改变了,但是编译器在第一次拿到a的时候认为其不会改变,将其放在寄存器中存储,每次也从寄存器中拿。

要先让编译器从a存放的地址处那,可以使用volatile对const类型进行修饰。

void test_07()
{volatile const int a = 10;volatile const int* pa = &a;int* paa = (int*)pa;*(paa) = 20;cout <<"*paa: " << *paa << endl;cout << "a: " << a << endl;
}

C++类型转化

C++对类型转换进行了分类,分为4种;每种使用一个关键字实现转化,使得类型转化有了可视性。

static_cast

static_cast用于非多态类型的转换(静态转换),编译器隐式执行的任何类型转换都可用static_cast,但它不能用于两个不相关的类型进行转换。

	double d = 1.2;int x = static_cast<int>(d);

指针和整形不能进行static_cast转化。

reinterpret_cast

reinterpret_cast操作符通常为操作数的位模式提供较低层次的重新解释,用于将一种类型转换为另一种不同的类型。

可用于不相关类型的转化。

int a = 10;
int* pa = &a;
int b = reinterpret_cast<int>(pa);

const_cast

const_cast最常用的用途就是删除变量的const属性,方便赋值。

volatile const int r = 10;
int* pr = const_cast<int*>(&r);

dynamic_cast

dynamic_cast用于将一个父类对象的指针/引用转换为子类对象的指针或引用(动态转换)。

用派生类指针可以转化为基类指针,则被称为向上转化,遵循复制兼容原则。

用基类指针可以转化为派生类类指针,则被称为向下转化,只有当基类指针指向派生类的时候才能实现转化。

当对基类指针和派生类指针进行转化的时候,建议使用dynamic_cast。

相关文章:

C++11新特性

目录 引入 C11新特性 统一的初始化列表 一切皆可{}初始化 std::initializer_list 统一的声明 auto decltype nullptr 范围for STL新增容器 STL新增容器接口 左值引用和右值引用 左值和右值 左值引用和右值引用 右值引用的优势(移动语义) 右值引用的使用场景 …...

492Q 型气缸盖双端面铣削组合铣床总体设计

一、引言 492Q 型气缸盖是发动机的重要组成部分&#xff0c;其双端面的加工精度对发动机的性能和可靠性有着重要影响。设计一款适用于 492Q 型气缸盖双端面铣削的组合铣床&#xff0c;能够提高加工效率和质量&#xff0c;满足发动机生产的需求。 二、总体设计要求 加工精度&…...

《软件设计师》复习笔记(4.2)——关系代数、函数依赖、范式

目录 一、关系代数 基本运算 笛卡尔积&#xff08;&#xff09; 投影&#xff08;π&#xff09; 选择&#xff08;σ&#xff09; 自然连接&#xff08;⋈&#xff09; 真题示例&#xff1a; 二、函数依赖 基本概念 Armstrong公理系统 键与约束 三、范式&#xff…...

IO流(二)

一、字符流 使用字节流可以读取文件中的字节数据。但是如果文件中有中文使用字节流来读取&#xff0c;就有可能读到半个汉字的情况&#xff0c;这样会导致乱码。虽然使用读取全部字节的方法不会出现乱码&#xff0c;但是如果文件过大又不太合适。 所以Java专门为我们提供了另…...

#Linux动态大小裁剪以及包大小变大排查思路

1 动态库裁剪 库分为动态库和静态库&#xff0c;动态库是在程序运行时才加载&#xff0c;静态库是在编译时就加载到程序中。动态库的大小通常比静态库小&#xff0c;因为动态库只包含了程序需要的函数和数据&#xff0c;而静态库则包含了所有的函数和数据。静态库可以理解为引入…...

天梯赛数据结构合集

1.集合操作&#xff1a;PTA | 程序设计类实验辅助教学平台 主要是注意set的取交集操作&#xff0c;AC代码&#xff1a; #include<bits/stdc.h> using namespace std; int n,m,k; set<int> a[60]; int main(){cin>>n;for(int i1;i<n;i){cin>>m;for…...

pdfjs库使用记录1

import React, { useEffect, useState, useRef } from react; import * as pdfjsLib from pdfjs-dist; // 设置 worker 路径 pdfjsLib.GlobalWorkerOptions.workerSrc /pdf.worker.min.js; const PDFViewer ({ url }) > { const [pdf, setPdf] useState(null); const […...

LIMS引领综合质检中心数字化变革,赋能质量强国战略

在质量强国战略的深入推进下&#xff0c;我国综合质检机构迎来了前所未有的发展机遇&#xff0c;同时也面临着诸多严峻挑战。随着检测领域从传统的食品药品监督向环境监测、新材料检测等新兴领域不断拓展&#xff0c;跨领域协同管理的复杂度呈指数级增长。作为提升产品质量的关…...

MySQL+Redis实战教程:从Docker安装部署到自动化备份与数据恢复20250418

MySQLRedis实战教程&#xff1a;从Docker安装部署到自动化备份与数据恢复 一、前言 在企业应用中&#xff0c;对MySQL和Redis运维的要求越来越高&#xff1a; 不能仅是启动就算部署运行稳定、隔离、访问控制、备份恢复、安全可靠&#xff0c;才是 企业级的基本功能 本文将手…...

嵌入式音视频开发指南:从MPP框架到QT实战全解析

嵌入式音视频开发指南:从MPP框架到QT实战全解析 一、音视频技术全景概述 1.1 技术演进里程碑 2003-2010年:标清时代(H.264/AVC + RTMP)2011-2018年:高清时代(H.265/HEVC + WebRTC)2019-至今:智能时代(AV1 + AI编解码 + 低延迟传输)1.2 现代音视频技术栈 #mermaid-s…...

如何使用Python进行自动化的系统管理?

Python已经成为系统管理员最流行的编程语言之一&#xff0c;因为它简单、灵活&#xff0c;并且广泛支持各种系统管理任务。无论您是自动执行重复性任务&#xff0c;管理文件和目录&#xff0c;还是处理用户权限&#xff0c;Python都提供了一组强大的工具来简化您的工作流程。 …...

拆机装机,通电主板亮灯风扇不转无法开机解决办法

电源开机线 重启线 usb耳机模块 灯线 看来电源没问题 参考https://zhidao.baidu.com/question/83939532/answer/2321171868.html 买了个新主板过几天到看看会不会好...

IntelliSense 已完成初始化,但在尝试加载文档时出错

系列文章目录 文章目录 系列文章目录前言一、原因二、使用步骤 前言 IntelliSense 已完成初始化&#xff0c;但在尝试加载文档时出错 File path: E:\QtExercise\DigitalPlatform\DigitalPlatform\main\propertyWin.ui Frame GUID:96fe523d-6182-49f5-8992-3bea5f7e6ff6 Frame …...

SuperMap iClient3D for WebGL 如何加载WMTS服务

在 SuperMap iClient3D for WebGL 中加载WMTS服务时&#xff0c;参数配置很关键&#xff01;下面我们详细介绍如何正确填写参数&#xff0c;确保影像服务完美加载。 一、数据制作 对于上述视频中的地图制作&#xff0c;此处不做讲述&#xff0c;如有需要可访问&#xff1a;Onl…...

[密码学实战]基于Python的国密算法与通用密码学工具箱

引言 在当今数字化浪潮中&#xff0c;信息安全已成为个人隐私保护与商业机密守护的核心议题。作为一位在密码学领域深耕多年的技术实践者&#xff0c;我深谙密码学工具在构建数字安全防线中的关键作用。正是基于这份认知与责任&#xff0c;我倾力打造了一款全方位、高性能的密…...

[密码学实战]详解gmssl库与第三方工具兼容性问题及解决方案

[密码学实战]详解gmssl库与第三方工具兼容性问题及解决方案 引言 国密算法&#xff08;SM2/SM3/SM4&#xff09;在金融、政务等领域广泛应用&#xff0c;但开发者在集成gmssl库实现SM2签名时&#xff0c;常遇到与第三方工具&#xff08;如OpenSSL、国密网关&#xff09;验证不…...

LIB-ZC, 一个跨平台(Linux)平台通用C/C++扩展库, stream 流操作

LIB-ZC, 一个跨平台(Linux)平台通用C/C扩展库, stream 流操作 lib-zc 封装了流操作命名空间 zcc基础类 stream(基类), iostream(io流封装) class stream 介绍 连接相关 // 都是虚函数, 为 iostream 等做准备virtual inline bool connect(const char *destination) { return …...

从零开始解剖Spring Boot启动流程:一个Java小白的奇幻冒险之旅

大家好呀&#xff01;今天我们要一起探索一个神奇的话题——Spring Boot的启动流程。我知道很多小伙伴一听到"启动流程"四个字就开始头疼&#xff0c;别担心&#xff01;我会用最通俗易懂的方式&#xff0c;带你从main()方法开始&#xff0c;一步步揭开Spring Boot的…...

概率多假设跟踪(PMHT):多目标跟踪中的概率软关联与高效跟踪算法解析

一、PMHT 的起源与核心定位 &#xff08;一&#xff09;背景 在多目标跟踪中&#xff0c;传统算法面临以下瓶颈&#xff1a; JPDA&#xff1a;单帧局部最优关联&#xff0c;无法处理跨帧长时间断联&#xff0c;且假设目标数固定&#xff08;如雷达跟踪中预设目标数范围&…...

4.信号和槽|存在意义|信号和槽的连接方式|信号和槽断开|lambda表达式|信号和槽优缺点(C++)

信号和槽存在意义 所谓的信号槽&#xff0c;终究要解决的问题&#xff0c;就是响应用户的操作 信号槽&#xff0c;其实在GUI开发的各种框架中&#xff0c;是一个比较有特色的存在 其他的GUI开发框架&#xff0c;搞的方式都要更简洁一些&#xff5e;~ 网页开发 (js dom api) 网…...

电脑 BIOS 操作指南(Computer BIOS Operation Guide)

电脑 BIOS 操作指南 电脑的BIOS界面&#xff08;应为“BIOS”&#xff09;是一个固件界面&#xff0c;允许用户配置电脑的硬件设置。 进入BIOS后&#xff0c;你可以进行多种设置&#xff0c;具体包括&#xff1a; 1.启动配置 启动顺序&#xff1a;设置从哪个设备启动&#x…...

Scrapeless Scraping Browser: A high-concurrency automation solution for AI

介绍&#xff1a;升级无缝抓取浏览器的并发能力 作为 Scrapeless 的开发者和创始团队&#xff0c;我们对人工智能自动化的未来充满真诚的热情。我们的使命是创建一个真正为 AI 设计的自动化浏览器。在过去的几年中&#xff0c;从 Browserless.io 到众多云服务供应商推出的“浏…...

Java项目—— 拼图小游戏(进阶版)

项目需求 在拼图小游戏基础版的基础上&#xff0c;完成下列要求&#xff1a; 一、实现更换拼图图片功能 1&#xff0c;给美女&#xff0c;动物&#xff0c;运动菜单按钮添加单击事件&#xff08;动作监听&#xff09; 2&#xff0c;当我们点击了美女之后&#xff0c;就会从13…...

解析:深度优先搜索、广度优先搜索和回溯搜索

一、深度优先搜索&#xff08;DFS&#xff09; 1. 原理 思想&#xff1a;从起始节点出发&#xff0c;顺着一条路径不断深入&#xff0c;直到到达目标或无路可走&#xff0c;然后回溯到最近的分支点&#xff0c;继续探索其他分支。 应用场景&#xff1a;路径查找、连通性检测、…...

探索大语言模型(LLM):循环神经网络的深度解析与实战(RNN、LSTM 与 GRU)

一、循环神经网络&#xff08;RNN&#xff09; 1.1 基本原理 循环神经网络之所以得名&#xff0c;是因为它在处理序列数据时&#xff0c;隐藏层的节点之间存在循环连接。这意味着网络能够记住之前时间步的信息&#xff0c;并利用这些信息来处理当前的输入。 想象一下&#xf…...

从零开始开发 MCP Server

作者&#xff1a;张星宇 在大型语言模型&#xff08;LLM&#xff09;生态快速演进的今天&#xff0c;Model Context Protocol&#xff08;MCP&#xff09;作为连接 AI 能力与真实世界的标准化协议&#xff0c;正逐步成为智能体开发的事实标准。该协议通过定义 Resources&#…...

Oracle日志系统之重做日志和归档日志

Oracle日志系统之重做日志和归档日志 重做日志归档日志 本文讨论Oracle日志系统中对数据恢复非常重要的两个日志&#xff1a;重做日志和归档日志。 重做日志 重做日志&#xff0c;英文名Redo Log&#xff0c;顾名思义&#xff0c;是用来数据重做的&#xff0c;主要使用场景是事…...

嵌入式开发--STM32G4系列硬件CRC支持MODBUS和CRC32

需求 在项目中&#xff0c;需要用到MODBUS CRC16校验&#xff0c;也要用到CRC32的校验&#xff0c;出于效率的考虑&#xff0c;准备用硬件CRC。 CRC 16的参数模型有很多种&#xff0c;我这里用的是MODBUS&#xff0c;对于不同的参数模型&#xff0c;会有不同的参数设置和初值&a…...

基于尚硅谷FreeRTOS视频笔记——4—多任务处理

目录 多任务处理 任务调度 任务的调度策略 优先级不同 优先级相同 多任务处理 通俗来讲就是 能够在同一时间 同时 进行多个任务的处理&#xff0c;这就时多任务处理。 但是&#xff0c;单核处理器一次只能处理一个任务&#xff0c;就是说在while中&#xff0c;任务们只能…...

中小型及初创企业如何实现数字化转型?

在当今动态的商业环境中&#xff0c;财务团队开始肩负起推动企业数字化转型的重任&#xff0c;即从传统的财务规划系统稳步迈向基于商业智能平台和以创新技术为驱动的解决方案领域。这些举措有望提高运营和分析效率&#xff0c;同时依托数据驱动的决策机制&#xff0c;帮助企业…...

java输出、输入语句

先创建一个用于测试的java 编写程序 #java.util使java标准库的一个包&#xff0c;这里拉取Scanner类 import java.util.Scanner;public class VariableTest {public static void main(String[] args) {#创建一个 Scanner 对象Scanner scanner new Scanner(System.in);System.…...

Python基础知识语法归纳总结(数据类型-1)

Python基础知识&语法归纳总结&#xff08;数据类型&#xff09; 一、Python基本数据类型 尤其注意&#xff0c;Python中的变量不需要特定的去声明&#xff0c;每个变量在使用前都必须对其进行赋值&#xff0c;它没有类型&#xff0c;我们所说的“类型”是变量所指的内存中对…...

Spring数据访问全解析:ORM整合与JDBC高效实践

目录 一、Spring ORM集成深度剖析 &#x1f31f; ORM模块架构设计 核心集成特性&#xff1a; 整合MyBatis示例配置&#xff1a; 二、Spring JDBC高效实践指南 &#x1f31f; 传统JDBC vs Spring JDBC对比 &#x1f31f; JdbcTemplate核心操作示例 批量操作优化&#xf…...

哪种电脑更稳定?Mac?Windows?还是云电脑? 实测解密

随着科技的发展进步&#xff0c;电脑已成为当下各类群体的必备产品之一&#xff0c;它的妙用有很多&#xff0c;无论是学生党、打工人还是已经退休的人群或都离不开它的存在。然而&#xff0c;电脑虽好却也差异很大、不同品牌、不同系统、不同配置、不同价位的统统都会有区别。…...

【AI模型学习】关于写论文——论文的审美

文章目录 一、“补丁法”&#xff08;Patching&#xff09;1.1 介绍1.2 方法论1.3 实例 二、判断工作的价值2.1 介绍2.2 详细思路2.3 科研性vs工程性 三、novelty以及误区3.1 介绍3.2 举例 看了李沐老师的读论文系列后&#xff0c;总结三个老师提到的有关课题研究和论文写作的三…...

【面经】杭州产链数字科技一面

1.介绍一下自己 面试官您好&#xff01;我叫***&#xff0c;目前是就读于****计算机科学与技术专业的一名学生。我平时在学校也自学了编程相关的知识&#xff0c;比如Java基础、Springboot、SpringCloud&#xff0c;关系型数据库Mysql&#xff0c;非关系型数据库Redis&#xff…...

微信小程序调用yolo目标检测模型

目录 后端 前端微信小程序 完整代码 后端 利用Flask&#xff0c;调用目标检测模型&#xff0c;后端代码如下。 # flask_yolo.py from flask import Flask, request, jsonify from ultralytics import YOLO from PIL import Imageapp Flask(__name__) model_path best.p…...

vmware17 虚拟机 ubuntu22.04 桥接模式,虚拟机无法接收组播消息

问题描述&#xff1a; 在一个项目中&#xff0c;宿主机win10中&#xff0c;使用的vmware17pro 虚拟机安装的ubuntu22.04&#xff0c;按照网上的教程使用Qt绑定组播消息&#xff0c;在另外一个Ubuntu工控机上发送用wiresahrk抓包的组播消息 sudo tcpreplay -i enp1s0 --loop0 y…...

Kaggle-Bag of Words Meets Bags of Popcorn-(二分类+NLP+Bert模型)

Bag of Words Meets Bags of Popcorn 题意&#xff1a; 有很多条电影评论记录&#xff0c;问你每一条记录是积极性的评论还是消极性的评论。 数据处理&#xff1a; 1.首先这是文件是zip形式&#xff0c;要先解压&#xff0c;注意sep ‘\t’。 2.加载预训练的 BERT 分词器 …...

数字信号处理技术架构与功能演进

数字信号处理&#xff08;DSP&#xff09;是通过数字运算实现信号分析、变换、滤波及调制解调的技术领域&#xff0c;其发展过程与技术应用如下&#xff1a; 一、定义与核心功能 技术定义&#xff1a;通过算法将模拟信号转换为数字形式进行处理&#xff0c;具有高精度、可编程…...

IaaS架构剖析、场景实践

一、什么是 IaaS 1.1 定义 Infrastructure as a Service&#xff08;IaaS&#xff0c;基础设施即服务&#xff09;是一种按需、弹性提供计算、存储、网络和安全等底层 IT 资源的云服务模式。用户通过 API、CLI 或 Web 控制台即可在几分钟内创建、扩容或释放资源&#xff0c;而…...

国产之光DeepSeek架构理解与应用分析02

本专栏 国产之光DeepSeek架构理解与应用分析-CSDN博客 国产之光DeepSeek架构理解与应用分析02-CSDN博客 前置的一些内容理解 GPU TPU NPU的区别&#xff1f; 设计目的 GPU&#xff1a;最初是为了加速图形渲染而设计的&#xff0c;用于处理图像和视频数据&#xff0c;以提供高…...

EDID结构

EDID DDC通讯中传输显示设备数据 VGA , DVI 的EDID由128字节组成&#xff0c;hdmi的EDID增加扩展块128字节。扩展快的内容主要是和音频属性相关的&#xff0c;DVI和vga没有音频&#xff0c;hdmi自带音频&#xff0c;扩展快数据规范按照cea-861x标准。 Edid为了让pc或其他的图像…...

4.黑马学习笔记-SpringMVC(P43-P47)

1.SpringMVC简介 SpringMVC技术&#xff08;更少的代码&#xff0c;简便&#xff09;与servlet技术功能相同&#xff0c;属于web层开发技术。 SpringMVC是一种基于java实现MVC模型的轻量级web框架。 轻量级指的是&#xff08;内存占用比较低&#xff0c;运行效率高&#xff09;…...

CSS 文件格式

A QFrame#andrFrm[status"android_en"] A&#xff1a;表示父类或顶层窗口的类型。如果 A 是一个自定义的类名&#xff0c;确保该类已经正确注册到 Qt 系统中。QFrame&#xff1a;表示具体的控件类型。#andrFrm&#xff1a;表示控件的对象名称&#xff08;通过 setOb…...

java输出HelloWorld

创建一个java格式文件&#xff0c;这里命令为HelloWorld 这里我选择用notepad编译&#xff0c;也可以直接用记事本 #public 访问修饰词&#xff0c;表示这个类可以被其他任何类访问 #class 定义类的关键字 #HelloWorld 类名&#xff0c;遵循驼峰命名法&#xff08;首字母大写…...

【SAP ME 44】在 HANA DB中报废SFC时的SHOP_ORDER表记录锁定

症状 SELECT…FROM SHOP_ORDER FOR UPDATE 在 SFC 报废期间持有锁,当同时调用数量较大时,可能会导致 HANA 数据库出现大量锁积压。这有时会导致因等待 HANA 数据库释放“选择更新”锁而导致报废 SFC 花费数分钟。 HANA 数据库日志中的示例: # begin PreparedStatement_ex…...

《软件设计师》复习笔记(12.1)——范围管理、进度管理

目录 一、范围管理 1. 核心概念 2. 范围管理过程 WBS&#xff08;工作分解结构&#xff09;示例 真题示例&#xff1a; 二、进度管理 1. 核心过程 2. 关键工具与技术 真题示例&#xff1a; 一、范围管理 1. 核心概念 项目范围&#xff1a;为交付产品必须完成的工作…...

Git-使用教程(新手向)

一、基本概念&#xff1a; 1.Git&#xff0c;Github的关系&#xff1a; Git --- 本地用于管理代码的工具&#xff0c;可类比为游戏存档。&#xff08;存档&#xff0c;仓库&#xff0c;项目在Git中是一个东西&#xff09; Github --- 远程仓库平台&#xff0c;可类比为云端。…...

密码学中的盐值是什么?

目录 1. 盐值的基本概念 2. 盐值的作用 (1) 防止彩虹表攻击 (2) 防止相同的密码生成相同的哈希值 (3) 增加暴力破解的难度 3. 如何使用盐值&#xff1f; (1) 生成盐值 (2) 将盐值附加到密码 (3) 存储盐值和哈希值 (4) 验证密码 4. 盐值如何增加暴力破解的难度 在线暴…...