c++:模版 template
一、模版
1.格式:
template <typname T>
2.实现
2.1自动推导
模板只对紧跟在后面的第一行代码有效,如果后面还想定义模板函数需要重新定义模板
#include <iostream>
#include <string>template <typename T>
void Print(T value)
{std::cout << value << std::endl;
}template <typename T>
T add(T a, T b)
{T ret;ret = a + b;return ret;
}int main()
{Print(5);Print("hello");
}
2.2手动显性调用
何时需要手动显性调用模板:
无法通过函数的参数,推导出所有的模板类型
显性调用模板函数的格式:
函数名<数据类型1,数据类型2,.......>(参数);
二、STL
1.std::vector
创建迭代器
std::vector<int>::iterator it;
#includevector
本身会进行二倍扩容(再插入一个元素,原有的容量不够存就会进行二倍扩容)
1、bool empty(); 如果当前vector没有容纳任何元素,则empty()函数返回true,否则返回false 2、TYPE front(); front()函数返回当前vector起始元素的引用
3、TYPE back(); back() 函数返回当前vector最末一个元素的引用
4、void assign( size_type num, const TYPE &val ); 赋num个值为val的元素到vector中.这个函数将会清除掉为vector赋值以前的内容.
5、TYPE at( size_type loc ); at() 函数 返回当前Vector指定位置loc的元素的引用.
6、iterator begin(); begin()函数返回一个指向当前vector起始元素的迭代器.(理解为指向起始元素的指针)
7、iterator end(); end() 函数返回一个指向当前vector末尾元素的下一位置的迭代器.
8、size_type size(); size() 函数返回当前vector所容纳元素的数目
9、size_type capacity(); capacity() 函数 返回当前vector在重新进行内存分配以前所能容纳的元素数量
10、void push_back(const TYPE &val ); push_back()添加值为val的元素到当前vector末尾 11.std::vector的reserve()函数用于预留足够的空间以存储至少指定数量的元素。然而,这并不意味着 vector的大小(即包含的元素数量)会增加;它仅仅增加了vector的容量(capacity),即在不进行内存重新分配的情况下可以存储的元素数量。
push_back():一次只能添加一个数值
- push_back():需要传入一个已经构造好的对象,该对象会被复制或移动到容器的末尾。如果传入的是右值(临时对象),则可能会调用移动构造函数来避免复制。
- emplace_back():直接在容器的末尾构造新元素,无需先构造一个临时对象再复制或移动到容器中。它接受构造新元素所需的参数,并在容器内部使用这些参数直接构造元素。
1.1实例
#include <iostream>
#include <vector>class Vertex
{
public:float x, y, z;
};
std::ostream &operator<<(std::ostream &stream, const Vertex &vertex)
{stream << vertex.x << "," << vertex.y << "," << vertex.z;return stream;
}int main()
{std::vector<Vertex> v1;v1.push_back({1});v1.push_back({2, 3, 4});for (int i = 0; i < v1.size(); i++){std::cout << v1[i] << std::endl;}
}
定义了一个int类型实现vector类型容器的迭代器
for (int &v : v1)中如果还要隔一个输出的话,还需要引入一个count变量来控制
#include <iostream>
#include <vector>int main()
{std::vector<int> v1(5, 5);v1.at(2) = 6;v1.push_back(12);// for (int &v : v1)// std::cout << v << std::endl;std::vector<int>::iterator it;for (it = v1.begin(); it != v1.end(); it++){std::cout << *it << std::endl;}
}
#include <iostream>
#include <vector>int main()
{std::vector<int> v1(5, 5);v1.at(2) = 6;v1.push_back(12);int cout = 0;for (int &v : v1){if (cout % 2 == 0)std::cout << v << std::endl;cout++;}// std::vector<int>::iterator it;// for (it = v1.begin(); it != v1.end(); it++)// {// std::cout << *it << std::endl;// }
}
#include <iostream>
#include <vector>class Vertex
{
public:float x, y, z;Vertex(float x, float y, float z) : x(x), y(y), z(z){}
};
std::ostream &operator<<(std::ostream &stream, const Vertex &vertex)
{stream << vertex.x << "," << vertex.y << "," << vertex.z;return stream;
}int main()
{std::vector<Vertex> v1;v1.reserve(3);v1.push_back(Vertex(1, 2, 3)); // 显式调用v1.push_back({4, 5, 6}); // 隐式调用v1.emplace_back(7, 8, 9);for (int i = 0; i < v1.size(); i++){std::cout << v1[i] << std::endl;}
}
2.std::array概述
2.1固定大小
std::array的大小在编译的时候就固定好了,一旦创建好了,就不能改变
2.2标准库的集成
它是标准库的一部分,begin(),end(),size(),empty()等函数都是可以使用的
2.3.实例
#include <iostream>
#include <array>
#include <algorithm>void PrintArray(const std::array<int, 5> &data)
{for (int i = 0; i < data.size(); i++){std::cout << data[i] << std::endl;}
}int main()
{std::array<int, 5> data;data[0] = 1;data[1] = 8;data[2] = 6;data[3] = 4;data[4] = 3;std::sort(data.begin(), data.end());PrintArray(data);
}
若在定义void PrintArray(const std::array &data)时不想写死array数组的大小,可以使用模版,通过T来定义data的类型
#include <iostream>
#include <array>
#include <algorithm>template <typename T>
void PrintArray(T &data)
{for (int i = 0; i < data.size(); i++){std::cout << data[i] << std::endl;}
}int main()
{std::array<int, 5> data;data[0] = 1;data[1] = 8;data[2] = 6;data[3] = 4;data[4] = 3;std::sort(data.begin(), data.end());PrintArray(data);
}
3.std::vector和std::array的区别
3.1、内存管理和大小固定性
std::vector:
- 动态数组:std::vector是一个动态数组,其大小可以在运行时改变。
- 内存分配:它管理一个动态分配的数组,用于存储元素。随着元素的增加或删除,std::vector 可以自动调整其大小。
- 性能开销:当 std::vector 的大小改变时(尤其是增长时),可能需要重新分配更大的内存块,并将旧元素复制到新位置,这会有一定的性能开销。
std::array:
- 固定大小数组:std::array 是 C++11 中引入的固定大小的容器。其大小在编译时就必须确定,并且之后不能改变。
- 内存分配:std::array 的内存分配在栈上,因此其访问速度通常比 std::vector 快,因为它没有动态内存分配的开销。
- 大小固定:由于大小固定,std::array在编译时就能确定所需的内存空间,这有助于优化性能。
3.2、性能
- std::vector:由于其大小可以动态改变,因此在需要频繁调整容器大小时会有一定的性能开销。然而,对于大多数应用场景来说,这种开销是可以接受的,并且 std::vector 提供了灵活性和方便性。
- std::array:由于其大小固定且内存分配在编译时确定,因此 std::array 通常具有更好的性能,尤其是在需要频繁访问其元素时。没有动态内存分配的开销,也没有在增加或删除元素时的性能成本。
3.3、功能特性
- std::vector:
- 提供了丰富的成员函数,如 push_back()、pop_back()、resize()、insert() 和 erase() 等,用于动态调整容器的大小、插入和删除元素。
- 支持随机访问,可以使用下标运算符 [] 或 at() 函数来访问元素。
- 提供了迭代器接口,可以使用迭代器来遍历容器中的元素。
- std::array:
- 由于其大小固定,因此不支持动态调整容器大小的操作如 push_back() 和 pop_back()。
- 提供了与 std::vector 类似的成员函数,如 size()、at()、operator[]、front() 和 back() 等,用于访问和遍历容器中的元素。
- 也可以使用迭代器来遍历容器中的元素,但迭代器类型与 std::vector 的迭代器类型不同。
3.4、使用场景
- std::vector:适用于需要动态调整容器大小或不确定最终需要存储多少元素的场景。例如,存储用户输入的字符串、实现动态数组、堆栈和队列等数据结构、以及存储图像的像素值等。
- std::array:适用于需要固定大小数组的场景。例如,存储一组常量、实现静态数组、存储颜色的 RGB 值、实现矩阵和张量(在固定大小的情况下)以及实现缓冲区等。
4.std::lists
4.1主要功能
1、bool empty(); empty()函数返回真(true)如果链表为空,否则返回假
2、void push_back( const TYPE &val ); push_back()将val连接到链表的最后
3、void push_front( const TYPE &val ); push_front()函数将val连接到链表的头部。
4、iterator begin(); begin()函数返回一个迭代器,指向list的第一个元素
5、iterator end(); end()函数返回一个迭代器,指向链表的末尾。
6、size_type size(); size()函数返回list中元素的数量。
7、size_type max_size(); max_size()函数返回链表能够储存的元素数目。
8、void swap( list &lst ); swap()函数交换lst和现链表中的元素。
9、void sort(); sort()函数为链表排序,默认是升序
10、iterator insert( iterator pos, const TYPE &val );
insert( iterator pos, size_type num, const TYPE &val );
insert()插入元素val到位置pos,或者插入num个元素val到pos之前,或者插入start到end之间的元素到pos的位置。返回值是一个迭代器,指向被插入的元素。
11、reverse()逆置链表
#include <iostream>
#include <list>int main()
{std::list<int> l1;l1.push_back(0);l1.push_back(1);l1.push_back(2);std::list<int>::iterator it;for (it = l1.begin(); it != l1.end(); it++){std::cout << *it << std::endl;}l1.reverse();for (it = l1.begin(); it != l1.end(); it++){std::cout << *it << std::endl;}
}
三、智能指针(可以使用STL内的所有成员函数)
1.独占指针(unique_ptr)
1.1、概念
独占指针不能使用拷贝构造、拷贝赋值函数
1.2、实例
#include <iostream>
#include <memory>class Test
{
public:Test(){std::cout << "Test的无参构造" << std::endl;}~Test(){std::cout << "Test的析构构造" << std::endl;}
};
class Demo
{
public:Demo(){std::cout << "Demo的无参构造" << std::endl;}~Demo(){std::cout << "Demo的析构构造" << std::endl;}
};int main()
{std::unique_ptr<Test> p1(new Test);//auto p1=make_unique<Test>();// std::unique_ptr<Demo> p2(p1);//屏蔽了复制语义,不支持拷贝构造std::unique_ptr<Test> p3;// p3 = p1;屏蔽了复制语义,不提供拷贝赋值std::cout << p1.get() << std::endl; // 获取智能指针指向的地址p3 = move(p1); // 转移p1的空间所有权给p3p1.release(); // 只释放空间所有权p3.reset(); // 释放空间所有权的同时释放资源return 0;
}
在执行了move函数操作之后,将p1的空间所有权转移给p3,但p1的的空间资源仍然存在,等超过p1的作用域之后,p1就会被自动回收
成员函数:
- get() :获取智能指针指向的地址
- release() :释放智能指针对空间的所有权
- move():全局函数,移动(转移)空间的所有权
- reset() :释放空间所有权的同时释放资源
release()和reset()的区别:
reset()会在释放所有权的同时,释放掉堆区资源
release()只会释放空间所有权
2.共享指针(shared_ptr)
1.1概念(更推荐使用第二种)
shared_ptr<int> p {new int (100)};
shared_ptr<int> p = make_shared<int>(100);
1.2使用
允许多个shared_ptr实例指向同一个资源,可以使用拷贝构造,拷贝赋值函数,通过引用技术来追踪有多少个shared_ptr指针,当最后一个指向该自愿的shared_ptr被销毁时,资源才会被释放
std::shared_ptr<int>mySharePtr=make_shared<int>(20); std::shared_ptr<int>myOtherptr=mySharePtr;
成员函数:
可以使用unique_ptr一样的成员函数,在此基础上还多了:
use_count():返回当前指向该对象的shared_ptr实例的数量。
3.两者对比
3.1所有权
- unique_ptr:表示独占所有权的智能指针。在任意时刻,只能有一个unique_ptr指向一个给定的资源。当unique_ptr被销毁时,它所管理的资源也会被自动释放。
- shared_ptr:表示共享所有权的智能指针。允许多个shared_ptr实例指向同一个资源。它通过引用计数来追踪有多少个shared_ptr指向同一资源,当最后一个指向该资源的shared_ptr被销毁时,资源才会被释放。
3.2内存管理
- unique_ptr:使用独占式所有权模型。当unique_ptr离开作用域或被显式销毁时,它所管理的资源会被立即释放。
- shared_ptr:使用引用计数来管理内存。当引用计数变为0时(即没有shared_ptr指向该资源时),资源才会被释放。这允许多个shared_ptr实例共享同一个资源,而无需担心内存泄漏。
3.3性能
- unique_ptr:由于不需要维护引用计数,因此通常比shared_ptr具有更好的性能。
- shared_ptr:需要维护引用计数,这可能会引入一些性能开销。然而,在多线程环境下,shared_ptr提供了原子操作来维护引用计数,从而保证了线程安全。
3.4拷贝和赋值
- unique_ptr:不支持拷贝和赋值操作。这是因为unique_ptr是独占所有权的,如果允许拷贝和赋值,将会破坏其独占性。然而,unique_ptr支持通过std::move进行所有权转移。
- shared_ptr:支持拷贝和赋值操作。这是因为shared_ptr是共享所有权的,拷贝和赋值操作只会增加或减少引用计数,而不会改变资源的所有权。
3.5应用场景
- unique_ptr:适用于需要独占资源的场景。例如,管理文件句柄、数据库连接等。在这些场景中,确保资源在任何时刻都只能被一个所有者访问是非常重要的。
- shared_ptr:适用于需要共享资源的场景。例如,多个对象需要访问同一块内存或同一个数据结构时。使用shared_ptr可以方便地实现资源的共享和自动释放。
相关文章:
c++:模版 template
一、模版 1.格式: template <typname T> 2.实现 2.1自动推导 模板只对紧跟在后面的第一行代码有效,如果后面还想定义模板函数需要重新定义模板 #include <iostream> #include <string>template <typename T> void Print(T v…...
javascript切换类、删除类、修改类以及增加类
在JavaScript中,操作DOM元素的类(class)是一个常见的操作。以下是一些基本的方法来切换类、删除类、修改类以及增加内联样式: 切换类(Toggle Class) 切换类意味着如果类存在则移除它,如果不存…...
区块链学习笔记(2)--区块链的交易模型part1
模型基础 区块链的tx分为两种模型,分别是比特币为代表的UTXO(Unspent Transaction Output)模型,和以太坊为代表的Account模型。前者适用于货币记账,后者适用于链上应用。 UTXO模型 类似于现金的交易模型 一个tx包含…...
反射知识总结
狂神说 反射的功能: 类加载内存分析 类加载的时候,class对象就形成了。 类无论有多少对象,class对象只有一个。 获取类对象三种方式 反射,就是通过api获取一个类的类对象: 有三种方式: 方法一…...
selenium部署分布式 UI 自动化测试环境-Docker
一、根据selenium/hub官网的配置信息,进行配置。 How to run this image The Hub and Nodes will be created in the same network and they will recognize each other by their container name. A Docker network needs to be created as a first step.Create …...
算法刷题Day5: BM52 数组中只出现一次的两个数字
描述: 一个整型数组里除了两个数字只出现一次,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。 要求:空间复杂度 O(1),时间复杂度O(n)。 题目传送门 is here 思路: 方法一:最简单的思路就…...
使用docker-compose部署搜索引擎ElasticSearch6.8.10
背景 Elasticsearch 是一个开源的分布式搜索和分析引擎,基于 Apache Lucene 构建。它被广泛用于实时数据搜索、日志分析、全文检索等应用场景。 Elasticsearch 支持高效的全文搜索,并提供了强大的聚合功能,可以处理大规模的数据集并进行快速…...
多线程篇-5--线程分类(线程类型,springboot中常见线程类型,异步任务线程)
常见的线程类型包括用户线程(User Threads)、守护线程(Daemon Threads)、主线程(Main Thread)、工作线程(Worker Threads)和线程池中的线程。 一、用户线程(User Thread…...
详解高斯消元
详解高斯消元 好东西,可以求所有一次方程组的解。 \color {red} 好东西,可以求所有一次方程组的解。 好东西,可以求所有一次方程组的解。 前置知识 一般消元法的公理: 两方程互换,解不变; 一方程乘以非零数 k k k,解不变; 一方程乘以数 k k k加上另一方程,解不变。 …...
【Python网络爬虫笔记】5-(Request 带参数的get请求) 爬取豆瓣电影排行信息
目录 1.抓包工具查看网站信息2.代码实现3.运行结果 1.抓包工具查看网站信息 请求路径 url:https://movie.douban.com/typerank请求参数 页面往下拉,出现新的请求结果,参数start更新,每次刷新出20条新的电影数据 2.代码实现 # 使用网络爬…...
泷羽sec- shell编程(8) until循环以及函数基本创建调用 学习笔记
声明! 学习视频来自B站up主 **泷羽sec** 有兴趣的师傅可以关注一下,如涉及侵权马上删除文章,笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内容,只做学习交流,其他均与本人以及泷羽sec团队无关&a…...
Apache Flink从Kafka中消费商品数据,并进行商品分类的数量统计题
使用Apache Flink从Kafka中消费商品数据,并进行商品分类的数量统计是一个典型的流处理任务。以下是一个详细的步骤指南和示例代码,帮助你实现这一功能。 ### 前提条件 1. **安装Flink**:确保你的环境中已经安装了 Apache Flink。 2. **安装…...
Ubuntu 安装 MariaDB
安装 MariaDB具体步骤 1、更新软件包索引: sudo apt update2、安装 MariaDB 服务器: sudo apt install mariadb-server3、启动 MariaDB 服务(如果未自动启动): sudo systemctl start mariadb4、设置 MariaDB 开机启…...
GPT打字机效果—— fetchEventSouce进行sse流式请求
EventStream基本用法 与 WebSocket 不同的是,服务器发送事件是单向的。数据消息只能从服务端到发送到客户端(如用户的浏览器)。这使其成为不需要从客户端往服务器发送消息的情况下的最佳选择。 const evtSource new EventSource(“/api/v1/…...
Leetcode 3373. Maximize the Number of Target Nodes After Connecting Trees II
Leetcode 3373. Maximize the Number of Target Nodes After Connecting Trees II 1. 接替思路2. 代码实现 题目链接:3373. Maximize the Number of Target Nodes After Connecting Trees II 1. 接替思路 这一题和前一题Leetcode 3372其实整体思路上并没有啥太大…...
JS的魔法三角:constructor、prototype与__proto__
在JavaScript中,constructor、prototype和__proto__是与对象创建和继承机制紧密相关的三个概念。理解它们之间的关系对于掌握JavaScript的面向对象编程至关重要。下面将详细介绍这个魔法三角: 1. constructor 定义:constructor是一个函数&am…...
用c语言完成俄罗斯方块小游戏
用c语言完成俄罗斯方块小游戏 这估计是你在编程学习过程中的第一个小游戏开发,怎么说呢,在这里只针对刚学程序设计的学生,就是说刚接触C语言没多久,有一点功底的学生看看,简陋的代码,简陋的实现࿰…...
Leetcode打卡:N皇后
执行结果:通过 题目:51 N皇后 按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。 n 皇后问题 研究的是如何将 n 个皇后放置在 nn 的棋盘上,并且使皇后彼此之间不能相互攻击。 给你一个整数 n &#…...
位运算在嵌入式系统开发中的应用
目录 一、数据存储与节省 “绝技” 1.1. 传感器数据存储挑战 1.2. 位运算解决方案 1.2.1. 数据整合 1.2.2. 数据提取 1.3. 收益分析 二、硬件控制 “精准操纵术” 2.1. 位运算操控硬件寄存器的实例 2.2. 位运算在硬件控制中的优势 2.3. 电机驱动芯片寄存器控制示例 …...
livekit 服务部署
本地起 1. 拉取生成文件镜像 sudo docker pull livekit/generate 2. 生成配置文件 sudo docker run --rm -v $PWD:/output livekit/generate --local (记住输出信息) 3. 拉取livekit/livekit-server sudo docker pull livekit/livekit-server 4. 开始运行服务 sudo docker run…...
笔记:visual studio2022编译 和 运行 VTK9.4.0
一、下载源码 VTK官网下载对应源码。 Download | VTKhttps://vtk.org/download/ 二、编译动态库(基于Win11 24h) 1. 用VS打开VTK源码的CMakeLists.txt,等待项目配置完成。 生成完毕如图 2.生成动态库,点击全部生成,…...
【Linux | 计网】TCP协议深度解析:从连接管理到流量控制与滑动窗口
目录 前言: 1、三次握手和四次挥手的联系: 为什么挥手必须要将ACK和FIN分开呢? 2.理解 CLOSE_WAIT 状态 CLOSE_WAIT状态的特点 3.FIN_WAIT状态讲解 3.1、FIN_WAIT_1状态 3.2、FIN_WAIT_2状态 3.3、FIN_WAIT状态的作用与意义 4.理解…...
Qt Sensors 传感器控制介绍篇
文章目录 Qt Sensors 模块介绍前言 什么是 Qt Sensors?主要特点: 支持的传感器类型Qt Sensors 的核心组件应用场景优势总结 Qt Sensors 模块介绍 前言 随着现代硬件设备的不断发展,传感器已成为许多设备(如智能手机、平板电脑和…...
探索3D世界:使用 lib3ds 读取和解析 3DS 文件
在3D图形开发中,读取和解析3DS文件是创建和渲染3D场景的第一步。3DS(3D Studio)文件格式是一种广泛使用的3D模型文件格式,它包含了多种类型的数据,用于描述3D场景中的物体、材质、相机、灯光和动画等。lib3ds 是一个开…...
【开源免费】基于SpringBoot+Vue.JS服装生产管理系统(JAVA毕业设计)
博主说明:本文项目编号 T 066 ,文末自助获取源码 \color{red}{T066,文末自助获取源码} T066,文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析…...
计算机技术:冯·诺伊曼架构
冯诺伊曼架构(Von Neumann Architecture)是由著名数学家和计算机科学家约翰冯诺伊曼(John von Neumann)在20世纪40年代提出的一种计算机设计模型。它奠定了现代通用计算机设计的基础。 1. 核心思想 冯诺伊曼架构的核心思想是存储…...
在Window10或11系统中同时安装 JDK8 和 JDK11
在Window10或11系统中同时安装 JDK8 和 JDK11 最近写项目,之前的项目是用Java8环境开发的,在二次迭代中,但是新开发的项目采用Java11环境来开发,所以需要同时安装JDK8和JDK11环境,但是两个环境是不能同时使用的&#…...
Hbase2.2.7集群部署
环境说明 准备三台服务器,分别为:bigdata141(作为Hbase主节点)、bigdata142、bigdata143确保hadoop和zookeeper集群都先启动好我这边的hadoop版本为3.2.0,zookeeper版本为3.5.8 下载安装包 下载链接:In…...
Java学习,数据结构
Java 提供了丰富的数据结构来处理和组织数据,Java的 java.util 包中提供了许多这些数据结构的实现,可以根据需要选择合适的类。 List(列表) ArrayList:基于动态数组的数据结构,允许包含重复元素和 null。 …...
微众银行前端面试题及参考答案
使用的协议是 HTTP 还是 HTTPS,为什么没用 HTTPS? 在前端开发中,有些网站使用 HTTP 协议,有些使用 HTTPS 协议。 使用 HTTP 协议的情况可能是因为网站对安全性的要求不是极高,或者处于开发的早期阶段,还没有…...
spark同步mysql数据到sqlserver
使用Apache Spark将数据从MySQL同步到SQL Server是一个常见的ETL(Extract, Transform, Load)任务。这里提供一个基本的步骤指南,以及一些代码示例来帮助你完成这项工作。 ### 前提条件 1. **安装Spark**:确保你的环境中已经安装了…...
使用 useMemo 和 React.memo 优化 React 组件渲染
在 React 中,性能优化是一个重要的主题,特别是在复杂的组件树中。本文将演示如何在同一个父组件中使用 useMemo 和 React.memo 来优化子组件的渲染。 1. 组件结构 创建一个父组件,包含两个子组件: MemoChild:使用 R…...
像素流送api ue多人访问需要什么显卡服务器
关于像素流送UE推流,在之前的文章里其实小芹和大家聊过很多,不过今天偶然搜索发现还是有很多小伙伴,在搜索像素流送相关的问题,搜索引擎给的提示有这些。当然这些都是比较短的词汇,可能每个人真正遇到的问题和想获取的…...
Bert+CRF的NER实战
CRF(条件随机场-Conditional Random Field) 原始本文:我在北京吃炸酱面 标注示例: 我O在O北B-PLA京I-PLA吃O炸B-FOOD酱I-FOOD面I-FOOD CRF: 目的:提出一些不可能出现的预测组合(例如I-PLA不能…...
python学习笔记8-函数2
参数传递 传不可变对象 & 传可变对象 def func(b):print(id(a), a) #140737041872600 234print(id(b), b) #140737041872600 234a 234 func(a)def func(b):print(id(a), a) #1413554098560 [343]print(id(b), b) #1413554098560 [343]a [343] func(a)def func(b):b.appe…...
【linux学习指南】详解Linux进程信号保存
文章目录 📝保存信号🌠 信号其他相关常⻅概念🌉在内核中的表⽰ 🌠 sigset_t🌠信号集操作函数🌉sigprocmask🌉sigpending 🚩总结 📝保存信号 🌠 信号其他相关常…...
Postman设置接口关联,实现参数化
🍅 点击文末小卡片 ,免费获取软件测试全套资料,资料在手,涨薪更快 postman设置接口关联 在实际的接口测试中,后一个接口经常需要用到前一个接口返回的结果, 从而让后一个接口能正常执行,这…...
ORACLE之DBA常用数据库查询
数据库信息 数据库概要select a.name "DB Name", e.global_name "Global Name", c.host_name "Host Name", c.instance_name "Instance Name" , DECODE(c.logins,RESTRICTED,YES,NO) "Restricted Mo…...
C++之C++11新特性(三)--- 智能指针
目录 一、智能指针 1.1 为什么需要智能指针 1.2 内存泄漏 1.2.1 内存泄漏的基本概念 1.2.2 内存泄漏的分类 1.2.3 如何避免内存泄漏 1.3 智能指针的使用及其原理 1.3.1 RAII 1.3.2 智能指针的基本原理 1.3.3 auto_ptr 1.3.4 unique_ptr 1.3.5 shared_ptr 1.3.6 sha…...
12 设计模式之工厂方法模式
一、什么是工厂方法模式? 1.定义 在软件开发中,设计模式 是解决常见软件设计问题的最佳实践。而 工厂方法模式(Factory Method Pattern) 作为创建型设计模式之一,常常被用来解决对象创建问题。它通过将对象的创建交给…...
Python 自动化办公的 10 大脚本
大家好,我是你们的 Python 讲师!今天我们将讨论 10 个实用的 Python 自动化办公脚本。这些脚本可以帮助你简化日常工作,提高效率。无论是处理 Excel 文件、发送邮件,还是自动化网页操作,Python 都能派上用场。 1. 批量…...
十一、快速入门go语言之接口和反射
文章目录 接口:one: 接口基础:two: 接口类型断言和空接口:star2: 空接口实现存储不同数据类型的切片/数组:star2: 复制切片到空接口切片:star2: 类型断言 反射 📅 2024年5月9日 📦 使用版本为1.21.5 接口 十、Java类的封装和继承、多态 - 七点半的菜市…...
Python中字符串和正则表达式
Python中字符串和正则表达式 在Python编程中,字符串是最常用的数据类型之一。字符串用于表示文本数据,而正则表达式则是一种强大的工具,用于处理和匹配字符串中的模式。本文将介绍Python中的字符串操作、字符串格式化以及如何使用正则表达式…...
力扣刷题TOP101:8.BM10 两个链表的第一个公共结点
目录: 目的 思路 复杂度 记忆秘诀 python代码 目的 两个无环的单向链表,它们的第一个公共结点{{6,7}。 思路 这个任务是找到两个链表的第一个公共结点。可以看作两个心机boy偷偷补课翻车事件。平时嘴上说自己在家玩游戏,实际上背地里都偷…...
⽂件操作详解
⽬录 一 文件操作的引入 1 为什么使⽤⽂件? 2 什么是⽂件? 3 文件分类(1 从⽂件功能的⻆度来分类:程序⽂件/数据⽂件 2根据数据的组织形式:为⽂本⽂件/⼆进制⽂件) 二 ⽂件的打开和关闭 1 …...
UR开始打中国牌,重磅发布国产化协作机器人UR7e 和 UR12e
近日,优傲(UR)机器人公司立足中国市场需求,重磅推出UR7e和UR12e 两款本地化协作机器人。它们延续优傲(UR)一以贯之的高品质与性能特质,着重优化负载自重比,且在价格层面具竞争力&…...
PostgreSQL实现透视表查询
PostgreSQL 8.3版本发布时,引入了一个名为tablefunc的新扩展。这个扩展提供了一组非常有趣的函数。其中之一是交叉表函数,用于创建数据透视表。这就是我们将在本文中讨论的内容。 需求说明 解释此函数如何工作的最简单方法是使用带有数据透视表的示例…...
C#里怎么样使用Array.BinarySearch函数?
C#里怎么样使用Array.BinarySearch函数? 因为二分算法如此重要,所以要多加练习。 但是它的返回值,也有三种状态,导致很多人使用它的时候, 也感觉到迷惑的。 在这里的例子演示了三种返回值的使用: /** C# Program to Search an element with Array Indices*/ using …...
量化交易系统开发-实时行情自动化交易-8.5.VNPY平台
19年创业做过一年的量化交易但没有成功,作为交易系统的开发人员积累了一些经验,最近想重新研究交易系统,一边整理一边写出来一些思考供大家参考,也希望跟做量化的朋友有更多的交流和合作。 接下来会对于VNPY平台介绍。 VN.PY 是…...
分治算法中的主定理及其应用
引言 学习递归算法的时候,找到了用来计算算法复杂度的主定理。问大语言模型,发现回答的主定理描述有所不同。本文比较了两个不同版本中表述的差异。并给出一些例子用来计算分治递归类算法的复杂度。 主定理的不同版本 版本1 在《算法导论》第三版第四…...