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

40 list类 模拟实现

目录

一、list类简介

(一)概念

(二)list与string和vector的区别

二、list类使用

(一)构造函数

(二)迭代器

(三)list capacity

(四)list element access

(五)list modifiers

1、push_back与emplace_back的区别

2、注意

(六)list特有的接口

1、splice

2、sort

三、list类模拟实现


一、list类简介

(一)概念

        在 C++ 中,list是标准模板库(STL)中的一个容器类。它属于序列容器,用于存储一系列的元素。list容器的特点是它是一个带头双向循环链表,这意味着每个节点包含数据以及指向前一个节点和后一个节点的指针。具体声明如下:

       list类模板第一个参数是类型第二个参数是内存池(提高内存申请效率),在学习过程中关注第一个参数即可。

        注意:该类的头文件为<list>,在使用list类模板之前,需要包含这个头文件,例如:

#include <list>

(二)list与string和vector的区别

        list类中访问、遍历与修改的核心方式是使用迭代器并没有【 下标+ [ ] 】的概念(虽然可以实现,但效率极低),因为元素之间的物理空间并不连续,只是逻辑上连续。而string和vector既可以使用迭代器,也可以使用【 下标+ [ ] 】进行访问、遍历与修改。

        相对与string和vector接口,list类模板接口没有扩容的概念了,访问数据也只有访问头节点与尾节点的概念,修改部分接口最主要的就是头插与尾插,头删与尾删;swap操作也是直接交换地址,若直接使用算法库中的swap函数的话会进行深拷贝,效率会低。同时也有list类自身专用的接口,在本篇博客中作介绍。

二、list类使用

(一)构造函数

构造函数( constructor
接口说明
list (size_type n, const value_type& val = value_type())
构造的 list 中包含 n 个值为 val 元素
list ()
构造空的 list
list (const list& x)
拷贝构造函数
list (InputIterator first, InputIterator last)
用  [first, last)  区间中的元素构造 list

(二)迭代器

        可暂时将迭代器理解成一个指针,该指针指向list中的某个节点

函数声
接口说明
begin() + end()
返回第一个元素的迭代器 + 返回最后一个元素下一个位置的迭代器
rbegin() + rend()
返回第一个元素的 reverse_iterator, 即r end 位置 返回最后一个元素下一个位
置的 reverse_iterator, 即r begin 位置

        迭代器图解如下:

        注意:

        ① begin与end为正向迭代器,对迭代器执行++操作,迭代器向后移动;

        ② rbegin(end)与rend(begin)为反向迭代器,对迭代器执行++操作,迭代器向前移动。

(三)list capacity

函数声明
接口说明
empty
检测 list 是否为空,是返回 true ,否则返回 false
size
返回 list 中有效节点的个数

(四)list element access

函数声明
接口说明
front
返回 list 的第一个节点中值的引用
back
返回 list 的最后一个节点中值的引用

(五)list modifiers

函数声明
接口说明
push_front
在  list  首节点前插入值为 val 的节点
pop_front
删除 list 中第一个节点
push_back
list 尾部插入值为 val 的结点
pop_back
删除 list 中最后一个节点
insert
在  pos  位置中插入值为  val  的节点
erase
删除  pos  位置的节点
swap
交换两个 list 中的节点
clear
清空 list 中的有效节点

emplace_front

类似于头插

emplace_back类似于尾插

1、push_back与emplace_back的区别

        ① push_back的参数是模板类型的引用值,什么类型的list就要传什么类型的值进去,是固定的。传递参数过程如下代码所示:

class Pos
{
public:Pos(int row = 0, int col = 0):_row(row), _col(col){}private:int _row;int _col;
};void test02()
{Pos p1(1, 2);list<Pos> lt1;lt1.push_back(p1);lt1.push_back(Pos(24,36));lt1.push_back({ 24,36 });
}

        先构造出一个Pos对象,然后使用push_back进行尾插,第二、三个push_back函数的参数中构造的是Pos类的匿名对象和隐式转化的临时对象,临时对象有常性,所以push_back的参数使用const value_type& val接收。

        ② emplace_back是一个函数模板,它的可变模板参数可以传多个参数,能够自动识别实参并推导类型;但不能走隐式类型转化,因为传 {3,3} 的话会被自动推导为【用{ }括起来的列表】,因此形参并不知道是什么类型,就会报错,原因是类型不明确。而使用push_back的list已经实例化为Pos类型的对象,所以push_back的形参已经默认为是Pos类型了,可以进行隐式类型转化。

lt1.emplace_back({ 24,36 });//报错

        但可以使用下面这种方法:

lt1.emplace_back( 24,36 );

        可以直接传初始化Pos对象的值,它的可变模板参数会把这两个数识别为 int 整形,会把这两个整形变成参数包往后传,直接初始化节点对象(直接构造),会更加高效。支持传递构造对象的参数。现阶段知道有这样的用法就行。

        也只有emplace_back直接传递构造对象的参数的效率会高,传递对象或匿名对象的时候,效率与push_back没有区别。代码如下所示:

void test03()
{Pos p2(1, 2);list<Pos> lt2;lt2.emplace_back(p2);//构造 + 拷贝构造lt2.emplace_back(Pos(24, 36));//构造 + 拷贝构造//lt2.emplace_back({ 24,36 });这样写会因为类型不明确而报错lt2.emplace_back(24,36);//直接构造,比前面的效率都高
}

        编译器也可能把【匿名对象Pos(24,36)】的参数直接传给节点进行构造,提高效率。

2、注意

        list里面没有find,但可以使用算法库中的find函数,参数为一段迭代区间,没找到就返回迭代空间的最后一个迭代器,如it.end(),找到之后就返回目标节点的位置,可以进行插入或删除操作。

(六)list特有的接口

函数声明接口说明

reverse

逆置

merge

两个链表归并,有序的列表归并后依旧有序,会把参数中的列表拿走进行归并,

归并后内容为空

unique

去重复值,只保留一个,前提为有序,需要提前使用sort进行排序

remove

去除,可以理解为是 find 和 erase 的结合,删除的是迭代器指向位置的数据

remove_if

后面凡是带_if的都是满足了条件的才会进行,参数是仿函数

splice

转移,把一个链表的值转移给另一个链表,参数中被转移的链表完成转移操作后为空。

sort排序(默认升序)

1、splice

        splice可以用来调整链表中节点的顺序,最近最少用缓存算法LRU会使用到:

void test04()
{list<int> lt1 = { 1,2,3,4,5 };//LRUint x;while (cin >> x){auto pos = find(lt1.begin(), lt1.end(), x);if (pos != lt1.end())lt1.splice(lt1.begin(), lt1, pos);//在lt1链表中把pos指向的数据转移到lt1.begin()前面}
}

        中断输入:输入【ctrl+z加换行】或【ctrl+c】结束流,正常结束,后面的程序继续执行。

        注意:linux中【ctrl+c】是杀死程序。

2、sort

        ① 使用list中的sort,排的是升序,可以理解为底层传的是【小于 < 】的概念(仿函数less)。若想要升序们可以sort后使用reverse进行逆置,也可以在底层传【大于 > 】的概念(仿函数greater),这些仿函数都是类模板,支持任意类型的比较。如下代码所示:

void test05()
{list<int> lt1 = { 1,4,5,3,2 };list<int> lt2 = { 1,4,5,3,2 };//排升序lt1.sort();for (const auto& i : lt1){cout << i << " ";}cout << endl;//排降序//greater<int> gt;有名对象少用,匿名对象用得更多一点lt2.sort(greater<int>());for (const auto& i : lt2){cout << i << " ";}cout << endl;
}

        ② 使用vector进行排序,但vector并没有sort这个接口,需要调用算法库中的sort:

void test06()
{vector<int> v1 = { 1,4,5,3,2 };vector<int> v2 = { 1,4,5,3,2 };sort(v1.begin(), v1.end());//升序sort(v2.begin(), v2.end(), greater<int>());//降序}

        那为什么list不用算法库中的sort而要自己实现sort接口?因为list的迭代器不匹配算法库中sort函数参数中迭代器的类型。迭代器在功能角度有以下分类:

  • 单向迭代器只支持++;例如:forward_list(forword是向前的意思) / unoredered_xxx(哈希表系列);
  • 双向迭代器支持++ / --;例如:list / map / set(链表和树);
  • 随机迭代器支持++ / -- / + / - ;例如:string/vector。

        三种迭代器在某种程度上是继承关系随机迭代器是父类(范围最大)双向迭代器是随机迭代器的子类(父类的特殊类,范围略小)单向迭代器是双向迭代器的子类(子类的特殊类,范围最小)那么函数参数支持双向迭代器的,为随机迭代器的类也可以使用,但单向迭代器不可用

        算法库中的sort函数参数接收的迭代器类型为随机迭代器(底层为快排,可以在c++的参考手册中查询得到函数参数接收的迭代器类型,或者在c++的参考手册中函数参数的标准命名就有暗示),而list迭代器的类型为双向迭代器,所以无法使用算法库中的sort函数,需要自己实现一个sort排序的接口。

        ③ 两种排序的效率对比:

        代码一:直接在vector和list进行sort对比

void test07()
{srand(time(0));//使随机值的种子每次运行都不同const int N = 1000000;list<int> lt1;list<int> lt2;vector<int> v;for (int i = 0; i < N; ++i){auto e = rand() + i;lt1.push_back(e);v.push_back(e);}int begin1 = clock();sort(v.begin(),v.end());int end1 = clock();int begin2 = clock();lt1.sort();int end2 = clock();cout << "vector 排序时间:" << end1 - begin1 << endl;cout << "list   排序时间:" << end2 - begin2 << endl;}

        在release版本运行的结果:

        代码二:把 lt2 的代码传给vector进行排序再把数据传递回来 && 直接在sort进行排序进行对比

void test08()
{srand(time(0));//使随机值的种子每次运行都不同const int N = 1000000;list<int> lt1;list<int> lt2;for (int i = 0; i < N; ++i){auto e = rand() + i;lt1.push_back(e);lt2.push_back(e);}int begin1 = clock();vector<int> v1(lt1.begin(), lt1.end());//拷贝vectorsort(v1.begin(), v1.end());//vector排序lt1.assign(v1.begin(), v1.end());//拷贝回lt2int end1 = clock();int begin2 = clock();lt2.sort();//list直接排int end2 = clock();cout << "list copy vector sort copy list sort:" << end1 - begin1 << endl;cout << "list sort:" << end2 - begin2 << endl;
}

        在release版本运行的结果:

        总结:若是少量数据的话使用list的sort接口进行排序的效率与vector调用算法库的sort接口的效率差不多,但是有大量数据的话vector调用算法库的sort排序效率会快很多

三、list类模拟实现

        成员全部公有的类可以用关键字struct进行声明;成员公私有混合的类用关键字class进行声明。

#pragma once
#include<assert.h>
#include<iostream>
using namespace std;namespace zyb
{//成员全部公有的类可以用关键字struct进行声明//成员公私有混合的类用关键字class进行声明//【节点类模板】//调用该类模板的作用:创建一个有数据但无指向的结点template<class T>struct list_Node{T _date;//存放数据list_Node<T>* _next;//指向前一个结点的指针list_Node<T>* _prev;//指向后一个结点的指针//全缺省做默认构造,new Node()时会自动调用,实现节点的数据初始化//缺省值给T的匿名对象来接收多种类型;//T在list创建时就已经定下list_Node(const T& x = T()):_date(x), _next(nullptr), _prev(nullptr){}};//【节点指针为核心的迭代器类模板】//以【节点模板类的指针】为核心,进行一系列操作符重载,使其符合迭代器的行为template<class T>struct list_Iterator//不进行限定,因为list会不断用到该结构体的成员,也会像节点一样作为隐形封装{//给【节点模板类】另起一个名,意为节点类型using Node = list_Node<T>;//给【迭代器模板类】另起一个名,意为迭代器类型using Self = list_Iterator<T>;Node* _node;//成员变量,是节点类型的指针list_Iterator(Node* node)//使用【节点模板类指针】构造迭代器:_node(node){}T& operator*()//实现迭代器的正确解引用{retrun _node->_date;}//出了该函数_data不会消失,因为节点还存在;//使用引用可以用别名修改_data,达到和指针一样解引用了能够修改指向元素的数据//返回数据本身T* operator->()//实现迭代器的对复合数据类型的正确引用{retrun &_node->_date;//先与成员访问运算符结合,再与取地址符结合;返回的是数据的地址}//返回类型为T的指针类型Self& operator++()//前置++{_node = _node->_next;return *this;//节点还在,可以使用引用返回}Self operator++(int)//后置++{Self tmp(*this);//先备份一个原来位置的指向就行_node = _node->_next;return tmp;}Self& operator--()//前置--{_node = _node->_prev;return *this;//节点还在,可以使用引用返回}Self operator--(int)//后置--{Self tmp(*this);_node = _node->_prev;return tmp;}bool operator!=(const Self& s)//判断迭代器是否相等{return _node != s._node;}};//创建list类模板//链表,元素为节点,访问节点中的内容需要正确行为的迭代器template<class T>class list{//默认私有,节点模板类,意为节点类型using Node = list_Node<T>;public://迭代器模板类,意为迭代器类型using iterator = list_Iterator<T>;iterator begin()//定义迭代器的指向{return iterator(_head->_next);}iterator end()//定义迭代器的指向{return iterator(_head);}void empty_init()//对节点进行空初始化{_head = new Node();//new了一个结点的空间,并且调用了结点类模板的默认构造(有数据,无指向)_head->_next = _head;//修改指向_head->_prev = _head;//修改指向}list()//无参的默认构造{//调用节点的空初始化函数创造出一个指向自己的头结点,//数据为T类型的默认构造出来的数据empty_init();}void push_back(const T& x)//插入数据{Node* new_node = new Node(x);Node* tail = _head->_prev;new_node->_prev = tail;tail->_next = new_node;new_node->_next = _head;_head->_prev = new_node;}private:Node* _head;//指向头结点的指针(哨兵位指针)};
}

        以上内容仅供分享,若有错误,请多指正

相关文章:

40 list类 模拟实现

目录 一、list类简介 &#xff08;一&#xff09;概念 &#xff08;二&#xff09;list与string和vector的区别 二、list类使用 &#xff08;一&#xff09;构造函数 &#xff08;二&#xff09;迭代器 &#xff08;三&#xff09;list capacity &#xff08;四&#x…...

【原生js案例】如何实现一个穿透字体颜色的导航

普通的导航大家都会做&#xff0c;像这种穿透字体的导航应该很少见吧。高亮不是通过单独设置一个active类来设置字体高亮颜色&#xff0c;鼠标滑过导航项&#xff0c;字体可以部分是黑色&#xff0c;不分是白色&#xff0c;这种效果的实现 感兴趣的可以关注下我的系列课程【we…...

(RHCE)工程师学习考证

如果你像我一样&#xff0c;非科班出身且对 IT 行业知识储备几乎为零&#xff0c;却立志考取 RHCE 红帽工程师证书&#xff0c;那么以下这份学习教程或许能助你一臂之力。 首先&#xff0c;要对 RHCE 有个基本的认识。RHCE 是红帽企业级 Linux 认证&#xff0c;它侧重于实际操作…...

Nuxt3 axios封装 使用axios接口请求

一、先安装axios npm install add axios 封装请求request.ts文件 import axios from axios import { ElMessage, Message } from "element-plus" import {getToken} from ./token.js const service axios.create({baseURL:/api,//本地使用 }) service.interceptor…...

东方通TongWeb替换Tomcat的踩坑记录

一、背景 由于信创需要&#xff0c;原来项目的用到的一些中间件、软件都要逐步替换为国产品牌&#xff0c;决定先从web容器入手&#xff0c;将Tomcat替换掉。在网上搜了一些资料&#xff0c;结合项目当前情况&#xff0c;考虑在金蝶AAS和东方通TongWeb里面选择&#xff0c;后又…...

引用类型集合的深拷贝,无需手动写循环:Apache Commons Lang (SerializationUtils)

在java中&#xff0c;我们如果想要对引用类型的集合进行深拷贝。有一种方式&#xff0c;就是调用SerializationUtils Apache Commons Lang (SerializationUtils) Apache Commons Lang 提供了 SerializationUtils 类&#xff0c;可以利用 Java 的序列化机制来进行集合及其元素…...

高阶函数:JavaScript 编程中的魔法棒

在JavaScript的世界里&#xff0c;高阶函数是一种强大的工具&#xff0c;它允许我们将函数作为参数传递或将函数作为返回值。这种特性使得JavaScript代码更加灵活和强大。本文将深入探讨高阶函数的定义、用法以及在实际项目中的最佳实践&#xff0c;帮助大家更好地理解和应用这…...

HuggingGPT Solving AI Tasks with ChatGPT and its Friends in Hugging Face 论文解读

1. 引言 近年来&#xff0c;大型语言模型&#xff08;LLMs&#xff09;如ChatGPT在自然语言处理领域取得了惊人的进展&#xff0c;展现出强大的语言理解、生成和推理能力。然而&#xff0c;当前的LLMs仍然存在一些局限性&#xff0c;例如无法处理复杂信息&#xff08;如视觉和…...

使用 ADB (Android Debug Bridge) 工具来截取 Android 设备的屏幕截图

可以使用 ADB (Android Debug Bridge) 工具来截取 Android 设备的屏幕截图。以下是具体的操作步骤&#xff1a; 1. 连接设备 确保 Android 设备通过 USB 或网络连接到电脑&#xff0c;并运行以下命令检查连接状态&#xff1a; adb devices2. 截取屏幕截图 运行以下命令将设…...

router.resolve 方法

router.resolve 方法在前端路由库&#xff08;如 Vue Router&#xff09;中用于解析路由信息。它接受一个路由对象或路径&#xff0c;并返回一个包含解析后的路由信息的对象。这个对象通常包含 href、route、location 等属性。 用法总结 方法签名&#xff1a; router.resolve(…...

linux 安装 Jenkins 教程

前言 Jenkins 是一个开源的自动化服务器&#xff0c;广泛用于持续集成&#xff08;Continuous Integration&#xff0c;CI&#xff09;和持续交付&#xff08;Continuous Delivery&#xff0c;CD&#xff09;领域。它帮助开发者自动化软件构建、测试、部署等过程&#xff0c;从…...

Vue3 使用 render 渲染函数透传组件

背景 我们透传组件的时候可能会用 slot&#xff0c;本文讲述的是另一种方式 props render 函数方式。当然具体的看业务场景。 实现 父组件 <AComp customComponent: () > {return h(UserAuthorization) }> </AComp>子孙组件 // 定义 render 组件&#xff…...

MongoDB 分片

MongoDB 分片 MongoDB 分片是一种数据库架构&#xff0c;用于将大量数据分布存储在多个服务器上。这种设计允许数据库扩展&#xff0c;以处理大量数据和高吞吐量操作。分片通过将数据集分割成小块&#xff0c;称为分片&#xff0c;并将这些分片分布到多个服务器上来工作。每个…...

Chrome webdriver下载-避坑

WebDriver以原生的方式驱动浏览器&#xff0c;不需要调整环境变量。 一、window版 1.chrome和chromedriver下载地址&#xff1a; Chrome for Testing availability 我下载的是如下两个安装包&#xff0c;解压即可。 2.导包 pip install selenium然后用python代码引用即可…...

【MFC】如何读取rtf文件并进行展示

tf是微软的一个带格式的文件&#xff0c;比word简单&#xff0c;我们可以用写字板等程序打开编辑。下面以具体实例讲解如何在自己程序中展示rtf文件。 首先使用VS2022创建一个MFC的工程。 VIEW类需要选择richview类&#xff0c;用于展示&#xff0c;如下图&#xff1a; 运行效…...

基于wifipumpkin3的AP伪造

一、软硬件需求 利用wifipumpkin-3进行AP伪造需要kali系统&#xff0c;还需要一张支持在kali的环境下能够支持AP伪造的无线网卡&#xff0c;如果是针对特定的无线网的话&#xff0c;再来第二张网卡的话更好用来转发流量更好。对于wifipumpkin-3的安装使用可以分为两种方式&…...

docker xxxx is using its referenced image ea06665f255d

Error response from daemon: conflict: unable to remove repository reference “registrxxxxxx” (must force) - container 9642fd1fd4a0 is using its referenced image ea06665f255d 这个错误表明你尝试删除的镜像正在被一个容器使用&#xff0c;因此无法删除。要解决这…...

svm支持向量机

支持向量机&#xff08;SVM&#xff09; 1. SVM 的核心思想 支持向量机&#xff08;Support Vector Machine, SVM&#xff09;是一种监督学习算法&#xff0c;用于分类和回归任务。其目标是找到一个超平面&#xff0c;将数据点分为不同类别&#xff0c;同时 最大化分类间隔&a…...

MySQL数据类型

MySQL数据库中的常用数据类型 数值型&#xff1a; ①整型 ②小数类型 定点型 浮点型 字符型&#xff1a; ①短的文本:char varchar ②长的文本:text blob(二进制) 日期型 ①数值型 整数应该知道的知识点 ①设置无符号和有符号 create table t_int( t1 int; #②默认有符…...

【深度学习】热力图绘制

热力图&#xff08;Heatmap&#xff09;是一种数据可视化方法&#xff0c;通过颜色来表示数据矩阵中的数值大小&#xff0c;以便更直观地展示数据的分布和模式。热力图在许多领域中都有应用&#xff0c;尤其在统计分析、机器学习、数据挖掘等领域&#xff0c;能够帮助我们快速识…...

高效Python开发工具PyCharm v2024.3全新发布,进一步提升编码体验!

JetBrains PyCharm是一种Python IDE&#xff0c;其带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具。此外&#xff0c;该IDE提供了一些高级功能&#xff0c;以用于Django框架下的专业Web开发。 立即获取PyCharm v2024.3正式版 Python 针对dataclass_transfor…...

Ubuntu 安装 Samba Server

在 Mac 上如何能够与Ubuntu 服务器共享文件夹&#xff0c;需要在 Ubuntu 上安装 Samba 文件服务器。本文将介绍如何在 Ubuntu 上安装 Samba 服务器从而达到以下目的&#xff1a; Mac 与 Ubuntu 共享文件通过用户名密码访问 安装 Samba 服务 sudo apt install samba修改配置文…...

WPF 实现 鼠标点击 取消 TextBox 光标

WPF 实现 鼠标点击 取消 TextBox 光标 原始需求&#xff1a;TextBox 控件光标取消后运行特定功能函数 所遇问题&#xff1a;若无相关事件&#xff0c;则除了点击其他控件等方式外&#xff0c;无法准确取消光标 解决思路&#xff1a;通过捕获 TextBox 控件外鼠标点击或鼠标移…...

cron服务执行定时任务

参考链接 cron表达式在线解析&#xff1a;quartz/Cron/Crontab表达式在线生成工具-BeJSON.com 定时任务运行时报错解决方法 运行脚本报 权限不够问题&#xff1a; 可以在脚本文件夹下直接执行 如下指令运行RequestAPI.sh 脚本 ./RequestAPI.sh 如果出现权限不够问…...

Go 语言与时间拳击理论下的结对编程:开启高效研发编程之旅

一、引言 结对编程作为一种软件开发方法&#xff0c;在提高代码质量、增强团队协作等方面具有显著优势。而时间拳击理论为结对编程带来了新的思考角度。本文将以 Go 语言为中心&#xff0c;深入探讨时间拳击理论下的结对编程。 在当今软件开发领域&#xff0c;高效的开发方法和…...

【收藏】Cesium 限制相机倾斜角(pitch)滑动范围

1.效果 2.思路 在项目开发的时候&#xff0c;有一个需求是限制相机倾斜角&#xff0c;也就是鼠标中键调整视图俯角时&#xff0c;不能过大&#xff0c;一般 pitch 角度范围在 0 至 -90之间&#xff0c;-90刚好为正俯视。 在网上查阅了很多资料&#xff0c;发现并没有一个合适的…...

PostgreSQL的学习心得和知识总结(一百六十四)|深入理解PostgreSQL数据库之在 libpq 中支持负载平衡

目录结构 注&#xff1a;提前言明 本文借鉴了以下博主、书籍或网站的内容&#xff0c;其列表如下&#xff1a; 1、参考书籍&#xff1a;《PostgreSQL数据库内核分析》 2、参考书籍&#xff1a;《数据库事务处理的艺术&#xff1a;事务管理与并发控制》 3、PostgreSQL数据库仓库…...

TÜLU 3: Pushing Frontiers inOpen Language Model Post-Training

模型&#xff1a;https://huggingface.co/allenai 技术报告&#xff1a;https://allenai.org/papers/tulu-3-report.pdf 数据集&#xff1a;https://huggingface.co/collections/allenai/tulu-3-datasets-673b8df14442393f7213f372 GitHub&#xff1a;https://github.com/al…...

Pytest-Bdd-Playwright 系列教程(14):Docstring 参数

Pytest-Bdd-Playwright 系列教程&#xff08;14&#xff09;&#xff1a;Docstring 参数 前言一、什么是docstring?二、基本语法三、主要特点四、实际例子五、注意事项六、使用建议总结 前言 在自动化测试的过程中&#xff0c;我们经常需要处理复杂的测试数据或需要输入多行文…...

Docker部署WebRTC-Streamer

文章目录 WebRTC-Streamer概述Docker部署WebRTC-StreamerVue使用WebRTC-Streamer一些问题 WebRTC-Streamer概述 WebRTC-Streamer是一个基于WebRTC技术的流媒体传输工具&#xff0c;它可以通过Web浏览器实现实时音视频流的传输和播放。它提供了一种简单而强大的方式&#xff…...

linux-16 关于shell(十五)date,clock,hwclock,man,时间管理,命令帮助

想显示一下当前系统上的时间该怎么显示&#xff1f;有一个命令叫做date&#xff0c;来看date命令&#xff0c;如下图&#xff0c; 第一个星期几对吧&#xff1f;然后是月日小时分钟秒&#xff0c;最后一个是年对吧&#xff1f;CST指的是它的时间格式&#xff0c;我这个可以先姑…...

厦门凯酷全科技有限公司深耕抖音电商运营

在数字经济飞速发展的今天&#xff0c;抖音电商平台以其独特的社交属性和庞大的用户基础&#xff0c;迅速成为众多品牌和商家的新战场。在这个充满机遇与挑战的市场中&#xff0c;厦门凯酷全科技有限公司凭借其专业的服务、创新的理念和卓越的执行力&#xff0c;成为了抖音电商…...

C++多线程实战:掌握图像处理高级技巧

文章结尾有最新热度的文章,感兴趣的可以去看看。 本文是经过严格查阅相关权威文献和资料,形成的专业的可靠的内容。全文数据都有据可依,可回溯。特别申明:数据和资料已获得授权。本文内容,不涉及任何偏颇观点,用中立态度客观事实描述事情本身 导读 在当今的计算世界中,…...

CityEngine实践——常用cga文件解析系列(2)

上回书说到了&#xff1a; 3、RULES/COMPONENTS/MASSING/SUBURBAN_BLOCK DETACHED_HOUSES.CGA ROWHOUSES.CGA SEMI_DETACHED_HOUSES.CGA 4、RULES/COMPONENTS/MASSING/URBAN_BLOCK MONOBLOCK.CGA PERIMETER_8_SHAPE.CGA PERIMETER_MULTIPART.CGA 这个cga挺有意思&#xff0c…...

【人工智能】因果推断与数据分析:用Python探索数据间的因果关系

解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 因果推断是数据科学领域的一个重要方向,旨在发现变量间的因果关系,而不仅仅是相关性。本篇文章将从因果推断的理论基础出发,介绍因果关系的定义与建模方法,涵盖因果图(Causal Graph)、d-分离、反事实估计等…...

depth wisepoint wise

文章目录 1. Description2. code 1. Description point wise 1. function: for the separated pixel without pixel confusion 2. kernel size : 3x3 ,star matrix [[0,0,0],[0,1,0],[0,0,0]] depth wise 1. fuction: for the separated channel without channel confusion 2.…...

AI大模型学习笔记|神经网络与注意力机制(逐行解读)

来源分享链接&#xff1a;通过网盘分享的文件&#xff1a;详解神经网络是如何训练的 链接: https://pan.baidu.com/s/12EF7y0vJfH5x6X-0QEVezg 提取码: k924 内容摘要&#xff1a;本文深入探讨了神经网络与注意力机制的基础&#xff0c;以及神经网络参数训练的过程。以鸢尾花数…...

2025软考中级《数据库系统工程师》案例模拟题合集

1.【说明】某销售企业正在实施电商平台项目&#xff0c;主要功能模块包括用户中心、商品中心、交易中心、支付中心、营销中心等。其中支付中心模块包括了一个账户表&#xff1a;Account (ano, aname, balance)&#xff0c;其中属性含义分别为&#xff1a;账户号&#xff0c;账户…...

12.10深度学习_经典神经网络_GoogleNet自我理解

为了更清晰地展示 GoogLeNet 中每个卷积层及其相关参数&#xff0c;我们可以将这些信息整理成表格形式。这不仅有助于理解每一层的输入和输出尺寸&#xff0c;还能直观地看到卷积核的数量、大小、步长以及填充方式等关键参数。以下是 GoogLeNet 前几层&#xff08;包括两个卷积…...

CTFshow-命令执行(Web58-77)

CTFshow-命令执行(Web58-77) Web58 <?php if(isset($_POST[c])){$c $_POST[c];eval($c); }else{highlight_file(__FILE__); }Warning: system() has been disabled for security reasons in /var/www/html/index.php(17) : eval()d code on line 1 本题对于passthru&…...

android全局拖拽效果实现startDragAndDrop

有多种方式实现全角拖拽&#xff0c;我们基于系统标准的api startDragAndDrop 来做介绍 实现步骤&#xff1a; 一、应用的的拖拽 1.1 通过长按触发 holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {Overridepublic boolean onLongClick(View v) {C…...

MySQL之索引与事务

一、索引 索引是一种特殊的文件&#xff0c;包含着对数据表里所有记录的引用指针。可以对表中的一列或多列创建索引&#xff0c;并指定索引的类型&#xff0c;各类索引有各自的数据结构实现。 索引主要的目的是为了加快查找速度 作用 1、数据库中的表、数据、索引之间的关系&am…...

【OpenCV】基于分水岭算法的图像分割

介绍 分水岭算法&#xff08;Watershed Algorithm&#xff09;是一种基于形态学的图像分割方法&#xff0c;它模仿了地理学中的分水岭概念。在图像处理中&#xff0c;分水岭算法通过模拟水流从山顶流向谷底的过程来分割图像&#xff0c;其中局部极小值点被视为“山谷”&#x…...

深度学习:CPU和GPU算力

一、算力 “算力”&#xff08;Computing Power&#xff09;通常是指计算机或计算系统执行计算任务的能力。它是衡量系统处理数据、运行算法以及执行计算任务效率的重要指标。根据上下文&#xff0c;算力可以在以下几种场景中具体化&#xff1a; 1. 单机算力 CPU算力&#x…...

android studio 模拟器不能联网?

模拟器路径&#xff1a; C:\Users\Administrator\AppData\Local\Android\Sdk\emulator\emulator.exe.关闭所有AVD设备实例 导航至&#xff1a; C:\Users\userName\AppData\Local\Android\Sdk\emulator查看模拟器名称 AdministratorDESKTOP-6JB1OGC MINGW64 ~/AppData/Local/…...

php.ini 文件上传/执行时间/部分配置新手教程

1、上传文件大小配置 一般需要同时配置“upload_max_filesize”、“post_max_size”&#xff0c;配置格式如下&#xff1a; file_uploads On ;是否允许HTTP文件上传 upload_max_filesize 2M ;设置单个文件上传的最大尺寸 post_max_size 8M ;设置 POST 请求体的最大尺寸&am…...

大模型Qwen面试内容整理-应用场景与案例分析

Qwen模型凭借其强大的自然语言理解和生成能力,在多个实际应用场景中得到了广泛应用。以下是Qwen模型的主要应用场景及一些典型的案例分析,展示了它如何解决具体问题和带来实际价值。 智能对话系统 ● 应用场景 ○ 客服机器人:Qwen被用于开发智能客服机器人,能够理解客户的问…...

网易游戏分享游戏场景中MongoDB运行和分析实践

在游戏行业中&#xff0c;数据库的稳定和性能直接影响了游戏质量和用户满意度。在竞争激烈的游戏市场中&#xff0c;一个优秀的数据库产品无疑能为游戏的开发和后期的运营奠定良好的基础。伴随着MongoDB在不同类型游戏场景中的应用越来越广泛&#xff0c;许多知名的游戏公司都在…...

子查询与嵌套查询

title: 子查询与嵌套查询 date: 2024/12/13 updated: 2024/12/13 author: cmdragon excerpt: 子查询和嵌套查询是关系型数据库中强大的查询工具,允许用户在一个查询的结果中再进行查询。通过使用子查询,用户能够简化复杂的SQL语句,增强查询的灵活性和可读性。本节将探讨子…...

智星云技术文档:GPU测速教程

安装gpu burn git clone https://github.com/wilicc/gpu-burn cd gpu-burn/ make测试 ./gpu_burn 60100.0% procd: 14280 (7373 Gflop/s) - 13390 (6997 Gflop/s) - 15912 (7110 Gflop/s) - 13184 (7055 Gflop/s) - 13464 (7369 Gflop/s) - 13974 (7351 Gflop/s) - 16626 (7…...