c++11新特性随笔
1.统一初始化特性
c98中不支持花括号进行初始化,编译时会报错,在11当中初始化可以通过{}括号进行统一初始化。
c98编译报错
c++11:
#include <iostream>
#include <set>
#include <string>
#include <vector>int main()
{std::string str = {"111"};std::vector<std::string> vec = {"aaa","bbb","cc"};std::cout<<"str = "<<str.c_str()<<std::endl;for(auto it : vec){std::cout<<"it = "<<it.c_str()<<std::endl;}return 0;
}
输出:
root@ubuntu:~/mySpace/other/ERT# ./a.out
str = 111
it = aaa
it = bbb
it = cc
root@ubuntu:~/mySpace/other/ERT#
2.关键提auto自动推导变量类型
#include <iostream>
#include <set>
#include <string>
#include <vector>
#include <map>int main()
{std::vector<std::string> vec = {"aaa","bbb","cc"};//// 直接根据实际情况推导相关变量类型for(auto it : vec){std::cout<<"it = "<<it.c_str()<<std::endl;}std::map<std::string,std::string> m = {{"11","111"},{"33","333"}};for(auto &it : m){std::cout<<"first = "<<it.first.c_str()<<" "<<"second = "<<it.second.c_str()<<std::endl;}for(auto it = m.begin();it !=m.end();++it){std::cout<<"first = "<<it->first.c_str()<<" "<<"second = "<<it->second.c_str()<<std::endl;}//c++17.c++11不支持该属性// for (const auto& [key, value] : myMap) {// std::cout << "Key: " << key << ", Value: " << value << std::endl;// }return 0;
}
输出:
root@ubuntu:~/mySpace/other/ERT# ./a.out
it = aaa
it = bbb
it = cc
first = 11 second = 111
first = 33 second = 333
first = 11 second = 111
first = 33 second = 333
root@ubuntu:~/mySpace/other/ERT#
3.Lambda表达式
定义匿名函数对象,常用于简化代码,尤其是在需要传递函数作为参数的场景。在编译器编译过程中会将lambda表达式转化成一个匿名类,并且这个匿名类重载了operator()运算符,使得可以像函数一样被调用(类的仿制函数一样)。
lamda表达式函数会自动推倒返回值无需编写,带返回值的写法,如下:
语法结构表达:
// lamda表达式函数会自动推到返回值无需编写,带返回值的写法auto pFunRet = []() -> std::string {std::string s("rrrrr");return s;}; std::cout<<"pFunRet() = "<<pFunRet().c_str()<<std::endl;
a.无参表达
// 无参Lamda函数表达式auto pFun = [](){std::cout<<"This is lamda fun"<<std::endl;};pFun();
输出:
root@ubuntu:~/mySpace/other/ERT# ./a.out
This is lamda fun
root@ubuntu:~/mySpace/other/ERT#
如上表示无参数表达式,编译器会将上述函数转化成一个匿名累,如下,将函数转化成匿名类,直接像函数一样调用即可。
class __lambda_anonymous {
public:int operator()() const { std::cout<<"This is lamda fun"<<std::endl; }
};
b.有参数表达
// 带参数auto pFunParams = [](int a,std::string s){std::cout<<"Params lamda="<<a<<"-"<<s.c_str()<<std::endl;};pFunParams(100,"LX");
输出:
root@ubuntu:~/mySpace/other/ERT# ./a.out
Params lamda=100-LX
root@ubuntu:~/mySpace/other/ERT#
转化匿名类形式:
class __lambda_anonymous {
public:int operator()(int a,std::string s) const { std::cout<<"Params lamda="<<a<<"-"<<s.c_str()<<std::endl; }
};
c.值捕获
(值捕获,捕获作用域所有值,=可以替换成某个具体的值,表示单个变量捕获)
// 值捕获,捕获作用域所有值,=可以替换成某个具体的值,表示单个变量捕获int val_0 = 1;int val_2 = 2;auto pFunValue = [=](){// 值捕获都是只读权限,强行改变会编译报错,提醒read-only 'val_0'// val_0 += 1;// val_2 += 2;std::cout<<"val_0="<<val_0<<" val_2="<<val_2<<std::endl;};pFunValue();
输出:
root@ubuntu:~/mySpace/other/ERT# ./a.out
val_0=1 val_2=2
root@ubuntu:~/mySpace/other/ERT#
编译器转化:
class __lambda_anonymous {
private:int val_0 = 1;int val_2 = 2;
public:__lambda_anonymous(int val_0,int val_2) : val_0(val_0),val_2(val_0) {} // 构造函数int operator()() const { std::cout<<"val_0="<<val_0<<" val_2="<<val_2<<std::endl;; }
};
d.mutble关键字
通过该关键字修饰等价于函数内部做了一份拷贝,之后再对拷贝进行操作,故而可以修改其捕获value2,
// 值捕获2int value2 = 100;std::cout<<"before modify value2="<<value2<<std::endl;auto pFunValue2 = [value2]() mutable { // mutable 修饰等价于函数内部做了一份拷贝,之后再对拷贝进行操作,故而可以修改其捕获value2,如下输出结果展示:// before modify value2=100// value2=211// after modify value2=100value2 += 111;std::cout<<"value2="<<value2<<std::endl;};pFunValue2();std::cout<<"after modify value2="<<value2<<std::endl;
输出:
root@ubuntu:~/mySpace/other/ERT# ./a.out
before modify value2=100
value2=211
after modify value2=100
root@ubuntu:~/mySpace/other/ERT#
编译器匿名类:
class __lambda_unnamed {int value2 ;
public:__lambda_unnamed(int value2 ) : value2 (value2 ) {}int operator()(int value2) { // 注意:不再是constvalue2 += 111;std::cout<<"value2="<<value2<<std::endl;}
};
e.引用捕获
引用修改的是捕获的变量的本身,如下:
// 引用捕获int quote = 100;std::cout<<"before modify quote="<<quote<<std::endl;auto pFunQuote = ["e](){quote += 20; // 引用修改的是捕获的变量的本身,如下输出结果://before modify quote=100//quote=120//after modify quote=120std::cout<<"quote="<<quote<<std::endl;};pFunQuote();std::cout<<"after modify quote="<<quote<<std::endl;return 0;
输出:
root@ubuntu:~/mySpace/other/ERT# ./a.out
before modify value2=100
value2=211
after modify value2=100
root@ubuntu:~/mySpace/other/ERT#
编译器转换:
class __lambda_anonymous {
private:int quote; // 值捕获的成员变量
public:__lambda_anonymous(int quote) : quote(quote) {} // 构造函数int operator()(int quote) const { quote += 1;std::cout<<"quote="<<quote<<std::endl;; }
};
4.并发编程
a.创建线程:
#include <iostream>
#include <thread>void hello() {std::cout << "Hello from thread!\n";
}int main() {std::thread t(hello); // 创建线程并启动t.join(); // 等待线程结束// 分离线程,线程结束后自动释放资源// 注意:分离后不能再join()// t.detach(); return 0;
}
b.带参数线程处理函数
#include <iostream>
#include <thread>
void print(int id, const std::string& name) {std::cout << "ID: " << id << ", Name: " << name << "\n";
}int main() {std::thread t(print, 1, "Thread1");t.join();return 0;
}输出:
root@ubuntu:~/mySpace/other/ERT# ./a.out
ID: 1, Name: Thread1
root@ubuntu:~/mySpace/other/ERT#
c.参数引用传递
#include <iostream>
#include <thread>
void modify(int& x) { x *= 2;
}int main() {int x = 10;std::thread t(modify, std::ref(x));t.join();std::cout << x <<std::endl; // 输出20return 0;
}输出:
root@ubuntu:~/mySpace/other/ERT# ./a.out
20
root@ubuntu:~/mySpace/other/ERT#
d.线程id和当前线程
#include <iostream>
#include <thread>int main() {std::thread::id main_thread_id = std::this_thread::get_id(); // 当前线程std::thread t([&]() {if (std::this_thread::get_id() == main_thread_id) {std::cout << "This is the master thread\n";} else {std::cout << "This is a son thread\n";}});t.join();return 0;
}输出:
root@ubuntu:~/mySpace/other/ERT# ./a.out
This is a son thread
root@ubuntu:~/mySpace/other/ERT#
e.互斥锁
#include <iostream>
#include <thread>
#include <mutex>std::mutex mtx;
int shared_data = 0;void increment() {mtx.lock();std::thread::id current_id = std::this_thread::get_id();std::cout<<"current id = "<<current_id<<std::endl;++shared_data;mtx.unlock();
}// 更安全的方式:使用RAII锁
void safe_increment() {// 离开作用域时自动解锁std::lock_guard<std::mutex> lock(mtx);++shared_data;
}int main() {std::thread::id main_thread_id = std::this_thread::get_id(); // 当前线程std::thread t1(increment);std::thread t2(increment);t1.join();t2.join();std::cout<<"shared_date ="<<shared_data<<std::endl;return 0;
}输出:
root@ubuntu:~/mySpace/other/ERT# ./a.out
current id = 140137569199872
current id = 140137560807168
shared_date =2
root@ubuntu:~/mySpace/other/ERT#
f.原子操作
#include <iostream>
#include <thread>
#include <mutex>
#include <atomic>std::atomic<int> counter(0);void increment() {for (int i = 0; i < 1000; ++i) {++counter; // 原子操作,无需额外同步}
}int main() {std::thread t1(increment);std::thread t2(increment);t1.join();t2.join();std::cout << counter<<std::endl; // 总是2000return 0;
}输出:
root@ubuntu:~/mySpace/other/ERT# ./a.out
2000
root@ubuntu:~/mySpace/other/ERT#
g.异步操作
字段(Future/Promise/Async) std::future
、std::promise
和 std::async
来简化异步编程,它们共同构成了 C++ 的 并发编程模型,用于处理多线程任务和异步操作
std::async 简化异步任务的启动
#include <iostream>
#include <thread>
#include <mutex>
#include <atomic>
#include <future>int compute() {// 模拟耗时计算std::this_thread::sleep_for(std::chrono::seconds(1));return 42;
}void fun(){std::cout<<"This fun"<<std::endl;
}
int main() {std::future<int> result = std::async(std::launch::async, compute);// 可以做其他工作创建一个线程运行std::thread t(fun);t.join();std::cout << "Result: " << result.get() << "\n"; // 阻塞直到结果就绪return 0;
}输出:
root@ubuntu:~/mySpace/other/ERT# ./a.out
This fun
Result: 42
root@ubuntu:~/mySpace/other/ERT#
std::future: 用于获取异步计算的结果(阻塞等待)-未来值
-
功能:表示一个 异步计算的结果(可能在另一个线程中计算)。
-
特点:
-
通过
get()
获取结果(如果结果未就绪,会阻塞当前线程直到计算完成)。 -
只能获取一次结果(第二次调用
get()
抛出异常)。 -
通过
wait()
等待结果就绪(不获取值)。
-
-
适用场景:获取异步任务(如
std::async
或std::promise
)的返回值
案例:
#include <iostream>
#include <thread>
#include <mutex>
#include <atomic>
#include <future>int compute() {std::this_thread::sleep_for(std::chrono::seconds(2));std::cout << "during: " << 2 << std::endl;return 42; // 模拟耗时计算
}int main() {std::future<int> fut = std::async(std::launch::async, compute);// 异步启动一个任务std::cout << "Waiting for result..." << std::endl;int result = fut.get(); // 阻塞直到 compute() 完成std::cout << "Result: " << result << std::endl;return 0;
}输出:
root@ubuntu:~/mySpace/other/ERT# ./a.out
Waiting for result...
during: 2
Result: 42
root@ubuntu:~/mySpace/other/ERT#
std::promise: 用于线程间传递数据(生产者-消费者模式)
-
功能:用于 在线程间传递数据,允许一个线程设置值,另一个线程通过
std::future
获取该值。 -
特点:
-
promise.set_value()
设置值,并通知future
可以获取。 -
如果
promise
被销毁但未设置值,future.get()
会抛出std::future_error
。
-
-
适用场景:线程间通信,特别是当一个线程需要等待另一个线程的计算结果时。
案例:
#include <iostream>
#include <thread>
#include <mutex>
#include <atomic>
#include <future>void compute(std::promise<int> prom) {prom.set_value(42); // 设置值
}int main() {// 创建promise对象std::promise<int> prom;// 通过future获取值std::future<int> fut = prom.get_future(); // 通过移动给prom赋值std::thread t(compute, std::move(prom)); // 传递 promise// 阻塞直到 compute() 设置值int result = fut.get(); std::cout << "Result: " << result << std::endl;t.join();return 0;
}输出:
root@ubuntu:~/mySpace/other/ERT# ./a.out
Result: 42
root@ubuntu:~/mySpace/other/ERT#
8. 线程局部存储
a.局部全局变量
thread_local int tls_var = 0; 每个线程都有自己的 tls_var
#include <iostream>
#include <thread>// 每个线程都有自己的 tls_var,跟linux系统中__thread关键类似,多线程中,每个线程都独有一份全局变量。
thread_local int tls_var = 0; void increment() {tls_var++; // 修改的是当前线程的副本std::cout << "Thread " << std::this_thread::get_id() << ": tls_var = " << tls_var << std::endl;
}int main() {std::thread t1(increment); // t1 的 tls_var 初始为 0,执行后变为 1std::thread t2(increment); // t2 的 tls_var 初始为 0,执行后变为 1t1.join();t2.join();return 0;
}
b.类的静态线程局部变量
#include <iostream>
#include <thread>class Counter {
public:// 每个线程有自己的 countstatic thread_local int count; void increment() {count++;std::cout << "Thread " << std::this_thread::get_id() << ": count = " << count << std::endl;}
};// 静态成员类外初始化
thread_local int Counter::count = 0; int main() {Counter c;// t1 的 count 初始 0 → 1std::thread t1([&c]() {c.increment(); }); // t2 的 count 初始 0 → 1std::thread t2([&c]() { c.increment(); }); t1.join();t2.join();return 0;
}输出:每个线程都独享一份变量count
root@ubuntu:~/mySpace/other/ERT# ./a.out
Thread 140491193476864: count = 1
Thread 140491185084160: count = 1
root@ubuntu:~/mySpace/other/ERT#
以上就是c++11新特性总结笔记,可能还未完全,后续继续完善!欢迎学习指点!共同进步!!!
相关文章:
c++11新特性随笔
1.统一初始化特性 c98中不支持花括号进行初始化,编译时会报错,在11当中初始化可以通过{}括号进行统一初始化。 c98编译报错 c11: #include <iostream> #include <set> #include <string> #include <vector>int main() {std:…...
微信小程序文章管理系统开发实现
概述 在内容为王的互联网时代,高效的文章管理系统成为各类平台的刚需。幽络源平台今日分享一款基于SSM框架开发的微信小程序文章管理系统完整解决方案,该系统实现了多角色内容管理、智能分类、互动交流等功能。 主要内容 一、用户端功能模块 多角…...
3种FSC标签你用对了吗?
如果你留意过产品上的FSC小树标识,也许会发现它们很相似但又各不相同。 根据产品使用的FSC认证材料的不同比例,共有三种不同类型的FSC标签: 1、FSC 100% 所有使用的材料均来自负责任管理的FSC认证森林。 标签文本为:“ From well-…...
NLP高频面试题(五十四)——深度学习归一化详解
引言:大模型训练中的归一化需求 随着人工智能技术的快速发展,**大模型(Large Language Models, LLMs)**的规模与能力都呈爆发式增长。诸如GPT-4、BERT、PaLM等模型参数量从最初的百万级到如今的千亿、万亿级别,训练难度和效率问题日益显著。在超大模型的训练过程中,梯度…...
第5.5章:ModelScope-Agent:支持多种API无缝集成的开源框架
5.5.1 ModelScope-Agent概述 ModelScope-Agent,由阿里巴巴旗下ModelScope社区开发,是一个开源的、模块化的框架,旨在帮助开发者基于大型语言模型快速构建功能强大、灵活性高的智能代理。它的核心优势在于支持与多种API和外部系统的无缝集成&…...
筑牢数字防线:商城系统安全的多维守护策略
一、构建网络安全防护屏障 网络安全是商城系统安全的第一道防线。企业应采用先进的防火墙技术,实时监控和过滤进出网络的流量,阻止非法访问和恶意攻击。入侵检测与防御系统(IDS/IPS)也是不可或缺的安全组件,它能够及…...
PTC加热片详解(STM32)
目录 一、介绍 二、传感器原理 1.原理图 2.引脚描述 三、程序设计 main文件 jdq.h文件 jdq.c文件 四、实验效果 五、资料获取 项目分享 一、介绍 PTC是正温度系数热敏电阻的英文简称,其电阻值随着PTC热敏电阻本体温度的升高呈现阶跃性的增加。温度越高&…...
OpenCV 图形API(64)图像结构分析和形状描述符------在图像中查找轮廓函数findContours()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 在二值图像中查找轮廓。 该函数使用[253]中的算法从二值图像检索轮廓。轮廓是形状分析以及对象检测和识别的有用工具。请参阅 OpenCV 示例目录中…...
GIS开发笔记(15)基于osg和osgearth实现三维地图上添加路网数据(矢量shp)
一、实现效果 二、实现原理 准备路网图层数据(.shp、.prj、.dbf、.cpg),设置样式、贴地,添加图层到地球节点。 三、参考代码 {// 获取当前可执行程序所在的目录QString exeDir = QCoreApplication::applicationDirPath();// 构造 Shapefile 文件的完整路径...
Golang日志模块之xlog
基于douyu的xlog 依赖 github.com/douyu/jupiter/pkg/xlog go.uber.org/zap gopkg.in/natefinch/lumberjack.v2log相关结构体 types/log.go type Log struct {Env string toml:"env"InfoLogFileName string toml:"infoLogFileName"Error…...
guvcview-源码记录
guvcview源码记录 一、概述二、项目结构1. guvcview2. gview_audio3. gview_encoder4. gview_render1. render.c2. render_sdl2.c3. render_osd_crosshair.c4. render_osd_vu_meter.c5. render_fx.c 3. gview_v4l2core 三、四、五、六、 一、概述 项目地址:guvcvie…...
对比2款国产远控软件,贝锐向日葵更优
贝锐向日葵和ToDesk是两款国产的远程控制软件,其中贝锐向日葵比较老牌,2009年就推出了最早的版本,而ToDesk则是在前几年疫情期间出现的。如果要在这两款远控软件中进行一个对比和选择,我们可以从功能配置、性能表现、系统支持、使…...
SOC估算:开路电压修正的安时积分法
SOC估算:开路电压修正的安时积分法 基本概念 开路电压修正的安时积分法是一种结合了两种SOC估算方法的混合技术: 安时积分法(库仑计数法) - 通过电流积分计算SOC变化 开路电压法 - 通过电池电压与SOC的关系曲线进行校准 方法原…...
maxscript根据音频创建动画表情
方案1: Python pydub / Audacity phoneme recognition 来提取语音中的音素(phonemes)并输出为 JSON 供 3ds Max 使用 方案2: Papagayo输出.pgo 文件,通过 Python 脚本解析,然后转换成 JSON。 下面介绍下方案2&#…...
使用ast解ob混淆时关于types的总结
在AST解OB混淆过程中,babel/types模块(简称types)是核心操作工具,以下是典型应用场景及具体代码示例: 一、字符串解密场景 场景:OB混淆常将字符串存储为十六进制或Unicode编码,需还原为明文 ty…...
每天学一个 Linux 命令(32):sort
可访问网站查看,视觉品味拉满: http://www.616vip.cn/32/index.html sort 是 Linux 中用于对文本文件的行进行排序的命令,支持按字典序、数字、月份等多种方式排序。以下是详细说明和示例: 命令语法 sort [选项]... [文件]...常用选项 -n 或 --numeric-sort 按数值大小…...
解释两个 Django 命令 makemigrations和migrate
python manage.py makemigrations 想象一下,你正在设计一个房子。在开始建造之前,你需要一个详细的蓝图来指导建筑过程。在 Django 中,当你定义或修改模型(比如 Employee),你实际上是在设计数据库的“房子…...
tkinter的窗口构建、原生组件放置和监测事件
诸神缄默不语-个人技术博文与视频目录 本文关注用Python3的tkinter包构建GUI窗口,并用tkinter原生组件来进行排版(通过pack() / grid() / place(),并监测基础的事件(如按钮被点击后获取文本框输入信息、单/多选框选择结果等&…...
Hot100方法及易错点总结2
本文旨在记录做hot100时遇到的问题及易错点 五、234.回文链表141.环形链表 六、142. 环形链表II21.合并两个有序链表2.两数相加19.删除链表的倒数第n个节点 七、24.两两交换链表中的节点25.K个一组翻转链表(坑点很多,必须多做几遍)138.随机链表的复制148.排序链表 N…...
WebUI可视化:第6章:项目实战:智能问答系统开发
第6章:项目实战:智能问答系统开发 学习目标 ✅ 完整实现前后端分离的问答系统 ✅ 掌握本地AI模型的集成方法 ✅ 实现对话历史管理功能 ✅ 完成系统部署与性能优化 6.1 项目整体设计 6.1.1 系统架构 graph TDA[用户界面] -->|输入问题| B(Web服务器)B -->|调用模型| …...
项目质量管理
项目质量管理核心要点与高频考点解析 一、项目质量管理核心框架 三大核心过程: 规划质量管理:制定质量标准和计划(预防为主)。实施质量保证:审计过程,确保符合标准(过程改进)。控…...
利用TTP协议 ETag + 路由守卫 实现前端发版后通知用户更新得一个方案
利用 ETag 做提示更新的实现方案 ETag(Entity Tag)是万维网协议HTTP的一部分,是HTTP协议提供的若干机制中的一种Web缓存验证机制,是一个可以与Web资源关联的记号(token),并且允许客户端进行缓存…...
uniapp-商城-36-shop 购物车 选好了 进行订单确认2 支付方式颜色变化和颜色滤镜filter
颜色滤镜,在好多网页都这样使用,滤掉彩色,显示黑白,这在一些关键的日子中都这样使用。 1、依然回到订单确认页面 看到支付的颜色了嘛? <view class"payType"><view class"box" :class&q…...
CSRF请求伪造
该漏洞主要是关乎于用户,告诫用户不可乱点击链接,提升自我防范,才能不落入Hacker布置的陷阱! 1. cookie与session 简单理解一下两者作用 1.1. 🍪 Cookie:就像超市的会员卡 存储位置:你钱包里…...
爬虫瑞数6案例:深圳大学总医院,webEnv补环境
爬虫瑞数6案例:深圳大学总医院,webEnv补环境 一、准备工作二、webEnv补环境三、验证cookie四、验证请求结果五、总结声明: 该文章为学习使用,严禁用于商业用途和非法用途,违者后果自负,由此产生的一切后果均与作者无关 前言: 之前出了一篇深圳大学总医院爬虫教程,那时候…...
运维 vm windows虚拟机nat网络配置
参考 VMWare虚拟机网络配置 - 秋夜雨巷 - 博客园 vm设置虚拟网络段 设置网络段 网关地址 设置DHCP 自动化分配网络段 主机:设置ip 控制面板\所有控制面板项\网络连接 出现设置的虚拟机网卡 设置ip 虚拟机:设置ip...
PPO 强化学习机械臂 IK 训练过程可视化利器 Tensorboard
视频讲解: PPO 强化学习机械臂 IK 训练过程可视化利器 Tensorboard PPO 强化学习过程中,设置了verbose会显示数据,但还是不够直观,这里上一个可视化利器,Tensorboard,实际上stable baselines3中已经有了这部…...
巧记英语四级单词 Unit5-中【晓艳老师版】
ignore v.无视,不理睬 发音“一个闹”,对付一个无理取闹的孩子,最好的方式就是无视 不理睬ignorant a.无知的,不礼貌的 对于什么事都无视,中国第一个不平等条约问也不知道就是无知的neglect n.忽视 negative消极的&a…...
Linux操作系统从入门到实战(三)Linux基础指令(上)
Linux操作系统从入门到实战(三)Linux基础指令(上) 前言一、ls 指令二、pwd三、cd四、touch 指令五、mkdir六、rmdir 指令和 rm 指令七、man 指令八、cp九、mv 指令十、cat 指令十一、 more 指令十二、less 指令十四、head 指令十五…...
MDF标准
MDF(Measurement Data Format),测量数据格式,是ASAM(自动化及测量系统标准协会)定义的, 是一种二进制文件,需要使用二进制文件编辑器查看. 作为一种紧凑的二进制格式,ASAM MDF提供了对海量测量数据的高效及高性能存储方案。MDF由松散耦合的二进制块组成,以实现灵活且高…...
如何本地无损放大图片保持高清画质
软件介绍 这款工具能让你轻松放大图片而不失真,最高支持4倍放大,并提供四种AI模型,适配不同风格的图像处理需求,包括普通照片、插画和漫画。它支持JPG、PNG、WEBP三种格式的输出,小巧便携,仅占用54.1MB空…...
【视频时刻检索】Text-Video Retrieval via Multi-Modal Hypergraph Networks 论文阅读
Text-Video Retrieval via Multi-Modal Hypergraph Networks 论文阅读 ABSTRACT1 INTRODUCTION2 PRELIMINARIES3 OUR FRAMEWORK3.1 Multi-Modal Hypergraph Networks3.2 Variational Inference 4 EXPERIMENT6 CONCLUSION 文章信息: 发表于:WSDM 24 原文…...
PowerShell脚本实现|从文件夹动画序列中均匀选取关键帧(保留首尾帧)
文章目录 1. 问题概述2. 两种实现方案方案一:自动计算法(推荐)方案二:手动列表法 3. 操作流程对比4. 注意事项5. 常见问题解决6. 总结建议 1. 问题概述 我们经常需要从动画序列中选取关键帧,例如: 文件名…...
红黑树——如何靠控制色彩实现平衡的?
目录 引言 一、认识红黑树(RBTree) 二、为什么有了AVL树,还要红黑树? 1、AVL树 vs 红黑树,两棵树区别 2、如何选择? 三、红黑树的核心操作 3.1、红黑树结构定义 3.2、插入操作 四、红黑树的验证 …...
金仓数据库KingbaseES技术实践类深度剖析与实战指南
一、语法兼容及迁移实战 (一)语法兼容的多元魅力 在当今多元化的数据库应用环境中,金仓数据库管理系统KingbaseES凭借其卓越的语法兼容能力脱颖而出。它采用的融合数据库架构,通过多语法体系一体化架构,实现了对Orac…...
Estimands与Intercurrent Events:临床试验与统计学核心框架
1. Estimands(估计目标)概述 1.1 定义与作用 1.1.1 定义 Estimand是临床试验中需明确提出的科学问题,即研究者希望通过数据估计的“目标量”,定义“治疗效应”具体含义,确保分析结果与临床问题一致。 例如,在研究某种新药对高血压患者降压效果时,Estimand可定义为“在…...
测试基础笔记第十二天
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一、python基础1.认识python2.python环境搭建1.安装Python解释器2.安装PyCharm 3.基础语法1.注释2.变量3.标识符4.数据类型 4.程序的输入和输出1.程序的输入2.程序的…...
0. Selenium工具的安装
目录 前言一、安装Chrome浏览器与驱动1 安装2. 解压驱动包并将其放到Python目录中 二、安装Selenium0 前置条件:已经安装了Python1. 安装2.检查是否安装成功3. 测试用例 前言 提示:本篇介绍selenium工具的安装和使用 一、安装Chrome浏览器与驱动 1 安…...
MySQL元数据库完全指南:探秘数据背后的数据
🎥博主:程序员不想YY啊 💫CSDN优质创作者,CSDN实力新星,CSDN博客专家 🤗点赞🎈收藏⭐再看💫养成习惯 ✨希望本文对您有所裨益,如有不足之处,欢迎在评论区提出…...
嵌入式鸿蒙系统环境搭建与配置要求实现01
各位开发者大家好,今天主要给大家分享一下,鸿蒙系统的环境配置实现。 第一:鸿蒙配置基本要求 对电脑的要求,虚拟机配置建议 200GB 硬盘大小,10GB 内存,4*2CPU。 安装必要的依赖文件方法: sudo apt-get update && sudo apt-get install binutils git git-lfs g…...
【深度强化学习 DRL 快速实践】逆向强化学习算法 (IRL)
Inverse Reinforcement Learning (IRL) 详解 什么是 Inverse Reinforcement Learning? 在传统的强化学习 (Reinforcement Learning, RL) 中,奖励函数是已知的,智能体的任务是学习一个策略来最大化奖励 而在逆向强化学习 (Inverse Reinforc…...
Coding Practice,48天强训(23)
Topic 1:打怪(回合数与刀数、先后手关系) 登录—专业IT笔试面试备考平台_牛客网 #include <bits/stdc.h> using namespace std;int main() {int t;cin >> t;while (t--) {int h, a, H, A;cin >> h >> a >> H…...
策略模式(Strategy Pattern)详解
文章目录 1. 什么是策略模式?2. 为什么需要策略模式?3. 策略模式的核心概念3.1 策略(Strategy)3.2 具体策略(Concrete Strategy)3.3 上下文(Context) 4. 策略模式的结构5. 策略模式的…...
websheet 之 table表格
本控件只实现table的基础功能。 {.is-danger} 一、table基本使用 可以通过addTable函数动态增加table,代码如下: let tableColumn [];let col 1;tableColumn.push(测试 (col) 列);tableColumn.push(测试 (col) 列);tableColumn.push(测试 (col) …...
Python Cookbook-6.9 快速复制对象
任务 为了使用 copy.copy,需要实现特殊方法__copy__。而且你的类的__init__比较耗时所以你希望能够绕过它并获得一个“空的”未初始化的类实例。 解决方案 下面的解决方案可同时适用于新风格和经典类: def empty_copy(obj):class Empty(obj.__class__):def __in…...
Linux NIO 原理深度解析:从内核到应用的高性能 I/O 之道
Linux 的 非阻塞 I/O(Non-blocking I/O,NIO) 是构建高性能服务器的核心技术,其核心思想是通过 事件驱动模型 和 零拷贝技术 实现高并发、低延迟的网络通信。以下从底层机制到实际应用进行全面剖析。 一、Linux I/O …...
Redis 集群切片全解析:四种常见技术的原理、优劣与应用
Redis 集群切片是将数据分散存储在多个 Redis 节点上的技术,以提高系统的可扩展性和性能。以下是一些常见的 Redis 集群切片方式: 1.哈希切片 原理:通过对数据的键进行哈希运算,将哈希值映射到不同的切片(槽…...
html中margin的用法
在 HTML 页面布局中,margin 是 CSS 中用于设置 元素与元素之间的外边距(即元素外部的空白区域) 的属性。 它可以单独设置四个方向的边距:上(top)、右(right)、下(bottom…...
网络流量分析 | 流量分析基础
流量分析是网络安全领域的一个子领域,其主要重点是调查网络数据,以发现问题和异常情况。本文将涵盖网络安全和流量分析的基础知识。 网络安全与网络中的数据 网络安全的两个最关键概念就是:认证(Authentication)和授…...
语音合成之六端到端TTS模型的演进
端到端TTS模型的演进 引言Tacotron:奠基之作FastSpeech:解决效率瓶颈VITS:实现高保真和富有表现力的语音SparkTTS:利用LLM实现高效可控的TTSCosyvoice:一种可扩展的多语种TTS方法端到端TTS模型的演进与未来方向 引言 …...