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

n加1网站建设/整合营销名词解释

n加1网站建设,整合营销名词解释,html5网页制作工具,网站打不开dns修改吗本期主题:list的讲解和模拟实现博客主页:小峰同学分享小编的在Linux中学习到的知识和遇到的问题小编的能力有限,出现错误希望大家不吝赐1.list的介绍和使用1.1.list的介绍1.list是可以在常数范围内在任意位置进行插入和删除的序列式容器&…
本期主题:list的讲解和模拟实现
博客主页:小峰同学
分享小编的在Linux中学习到的知识和遇到的问题
小编的能力有限,出现错误希望大家不吝赐

1.list的介绍和使用

1.1.list的介绍

1.list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。 2.list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向 其前一个元素和后一个元素。 3. list与forward_list非常相似:最主要的不同在于forward_list是单链表,只能朝前迭代,已让其更简单高 效。 4. 与其他的序列式容器相比(array,vector,deque),list通常在任意位置进行插入、移除元素的执行效率 更好。 5. 与其他序列式容器相比,list和forward_list最大的缺陷是不支持任意位置的随机访问,比如:要访问list 的第6个元素,必须从已知的位置(比如头部或者尾部)迭代到该位置,在这段位置上迭代需要线性的时间 开销;list还需要一些额外的空间,以保存每个节点的相关联信息(对于存储类型较小元素的大list来说这 可能是一个重要的因素)

1.2.list的使用

1.2.1.成员函数

这个和vector的差不多

1.2.2.迭代器

和vector相似
从此时开始就要知道迭代器的重要性了,不支持下标访问了,这时候迭代器就很重要了。
所有的容器真正的,统一的遍历方式就是迭代器。3

1.2.3.容量相关

1.2.4.访问相关

1.2.5.修改相关

1.2.6.操作相关

2.List的模拟实现

2.1.源码

源码
#pragma once
#include <utility>
#include<iostream>
#include<assert.h>
using namespace std;namespace zxf2
{template<class T>struct list_node{//共有成员变量list_node* _next;list_node* _prev;T _data;//每个节点的构造函数。list_node(const T& val = T()):_next(nullptr),_prev(nullptr),_data(val){}};//这里实现的迭代器是普通版本的,那如果想要一个const版本的迭代器怎么办?//const list_iterator<T> it = lt.begin();//这样  显然不是我们想要的结果,//上述的写法只能是it 不能改,但是 const迭代器是 *it不能改动。//为什么vector模拟实现的时候 直接 定义了 : typedef const T* const_iterator;自然就是实现了 it可以改,而 *it不能改的目的,(利用了指针的特性)////template<class T>//struct list_iterator//{//    //迭代器本质上是在控制节点的指针 _pnode;//    //是对节点(node)指针的封装。//    typedef list_node<T> node;//    typedef list_iterator<T> self;//迭代器类型重命名。//    //成员变量//    node* _pnode;//    //迭代器在创建的时候必须初始化//    //使用节点的指针来构造//    list_iterator(node* pnode){//        _pnode = pnode;//    }//    //前置++ ,--; 前置可以返回引用,也就返回迭代器本身。//    self& operator++()//    {//        _pnode = _pnode->_next;//        return *this;//    }//    self& operator--()//    {//        _pnode = _pnode->_prev;//        return *this;//    }//    //后置++ , -- ;不能返回引用。//    self operator++(int)//    {//        self tmp(*this);//出了函数tmp会被销毁的。//        _pnode = _pnode->_next;//        return tmp;//    }//    self operator--(int)//    {//        self tmp(*this);//出了函数tmp会被销毁的。//        _pnode = _pnode->_prev;//        return tmp;//    }//    //所以一般使用前置++,减少拷贝照成的空间和时间浪费。//    //判断两个迭代器是否相同就是迭代器里面的成员变量的地址是否相同。//    bool operator!=(const self& lt)const//    {//        return _pnode != lt._pnode;//    }//    bool operator==(const self& lt)const//    {//        return _pnode == lt._pnode;//    }//    T& operator*()//    {//        return _pnode->_data;//    }//};//template<class T>//struct list_const_iterator//{//    //迭代器本质上是在控制节点的指针 _pnode;//    //是对节点(node)指针的封装。//    typedef list_node<T> node;//    typedef list_const_iterator<T> self;//迭代器类型重命名。//    //成员变量//    node* _pnode;//    //迭代器在创建的时候必须初始化//    //使用节点的指针来构造//    list_const_iterator(node* pnode) {//        _pnode = pnode;//    }//    //前置++ ,--; 前置可以返回引用,也就返回迭代器本身。//    self& operator++()//    {//        _pnode = _pnode->_next;//        return *this;//    }//    self& operator--()//    {//        _pnode = _pnode->_prev;//        return *this;//    }//    //后置++ , -- ;不能返回引用。//    self operator++(int)//    {//        self tmp(*this);//出了函数tmp会被销毁的。//        _pnode = _pnode->_next;//        return tmp;//    }//    self operator--(int)//    {//        self tmp(*this);//出了函数tmp会被销毁的。//        _pnode = _pnode->_prev;//        return tmp;//    }//    //所以一般使用前置++,减少拷贝照成的空间和时间浪费。//    //判断两个迭代器是否相同就是迭代器里面的成员变量的地址是否相同。//    bool operator!=(const self& lt)const//    {//        return _pnode != lt._pnode;//    }//    bool operator==(const self& lt)const//    {//        return _pnode == lt._pnode;//    }//    const T& operator*()//这里是const迭代器和 普通迭代器真的区别,区别就这一点点。就是在解引用的时候,返回的是const类型还是普通类型。//        //返回const类型就是不能修改(const迭代器),返回普通类型就是可以修改(普通迭代器)。//    {//        return _pnode->_data;//    }//};//上面两个迭代器多少有点代码冗余。可以把他们合并在一起。template<class T , class ref, class ptr>
struct list_iterator
{//迭代器本质上是在控制节点的指针 _pnode;//是对节点(node)指针的封装。typedef list_node<T> node;typedef list_iterator<T, ref ,ptr> self;//迭代器类型重命名。//成员变量node* _pnode;//迭代器在创建的时候必须初始化//使用节点的指针来构造list_iterator(node* pnode) {_pnode = pnode;}//前置++ ,--; 前置可以返回引用,也就返回迭代器本身。self& operator++(){_pnode = _pnode->_next;return *this;}self& operator--(){_pnode = _pnode->_prev;return *this;}//后置++ , -- ;不能返回引用。self operator++(int){self tmp(*this);//出了函数tmp会被销毁的。_pnode = _pnode->_next;return tmp;}self operator--(int){self tmp(*this);//出了函数tmp会被销毁的。_pnode = _pnode->_prev;return tmp;}bool operator!=(const self& lt)const//这里的const有什么用?{return _pnode != lt._pnode;}bool operator==(const self& lt)const{return _pnode == lt._pnode;}ref operator*(){return _pnode->_data;}ptr operator->(){return &_pnode->_data;}self operator+=(size_t n){while (n--){_pnode = _pnode->_next;}return *this;}self operator-=(size_t n){while (n--){_pnode = _pnode->_prev;}return *this;}};template <class T>class list{//类名 list//类型 list<T>typedef list_node<T> node;public://typedef list_iterator<T> iterator;//typedef list_const_iterator<T> const_iterator;typedef list_iterator<T, T& ,T*> iterator;typedef list_iterator<T, const T&, const T*> const_iterator;//创建出头节点void empty_list(){_phead = new node(T());_phead->_next = _phead;_phead->_prev = _phead;}//无参构造list(){empty_list();}void push_back(const T& val){//node* tmp = new node(val);//tmp->_next = _phead;//tmp->_prev = _phead->_prev;//_phead->_prev->_next = tmp;//_phead->_prev = tmp;insert(iterator(_phead), val);}void push_front(const T& val){//node* tmp = new node(val);//tmp->_next = _phead;//tmp->_prev = _phead->_prev;//_phead->_prev->_next = tmp;//_phead->_prev = tmp;insert(iterator(_phead->_next), val);}//单参数构造list(const T& val){empty_list();push_back(val);}//迭代器构造的模板template<class input_iterator>list(input_iterator first, input_iterator last){//创建头节点empty_list();while (first != last){push_back(*first);//(*first)是 T/const T 类型的数据++first;}}//        //拷贝构造(古法) 里 lt1 = lt2;
//        list(const list<T>& lt)
//            //注意拷贝构造的参数也是引用,防止无线循环,
//        {
//            empty_list();
需要迭代器的支持
//            for (auto& e : lt){//注意这样的引用,const 可加可不加。
//                //引用1,防止e的空间浪费;2,list<list <T>>这种情况出现时,死循环。
//                push_back(e);
//            }
//        }void swap(list& lt){std::swap(lt._phead, _phead);}~list(){clear();delete _phead;_phead = nullptr;}void clear(){//注意这里只能是 iterator ,不能是 const_iterator //const list 才会返回const_iterator,但是 const list 不能修改iterator first = begin();//while (first != end())//{//    erase(first);//    ++first;//}//上述写法是错误的while (first != end()){first = erase(first);}}size_t size(){return _size;}bool empty(){return _size == 0;}//lt1 =lt2;list<T> operator=(list<T> lt){swap(lt);return *this;}//注意删除的时候要返回欲删除元素下一个元素的迭代器,iterator erase(iterator it){assert(it != end());node* next = it._pnode->_next;node* prev = it._pnode->_prev;next->_prev = prev;prev->_next = next;delete it._pnode;return iterator(next);// 匿名对象, 这里的生命周期只有一行,不能引用返回。--_size;}iterator insert(iterator pos, const T& val){node* newnode = new node(val);node* next = pos._pnode;node* prev = pos._pnode->_prev;newnode->_next = next;newnode->_prev = prev;prev->_next = newnode;next->_prev = newnode;return iterator(newnode);++_size;}void pop_back(){erase(iterator(_phead->_prev));}void pop_front(){erase(iterator(_phead->_next));}//拷贝构造(现代) 里 lt1 = lt2;list(const list<T>& lt)//注意拷贝构造的参数也是引用,防止无线循环,{//无论什么构造,都要先创建头节点empty_list();list tmp(lt.begin(), lt.end());//先创建一个list类型的临时局部变量,出了作用域会被销毁。swap(tmp);}//这里也不能返回引用iterator begin(){return iterator(_phead->_next);//匿名对象,生命周期只有一行}const_iterator begin()const{return const_iterator(_phead->_next);//匿名对象,生命周期只有一行}iterator end(){return iterator(_phead);//匿名对象,生命周期只有一行}const_iterator end()const{return const_iterator(_phead);//匿名对象,生命周期只有一行}private://list私有的成员node* _phead;size_t _size;};}

2.2.常见问题

2.2.1. list的迭代器失效

前面说过,此处大家可将迭代器暂时理解成类似于指针,迭代器失效即迭代器所指向的节点的无效,即该节 点被删除了。因为list的底层结构为带头结点的双向循环链表,因此在list中进行插入时是不会导致list的迭代 器失效的,只有在删除时才会失效,并且失效的只是指向被删除节点的迭代器,其他迭代器不会受到影响。
void TestListIterator1()
{int array[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };list<int> l(array, array+sizeof(array)/sizeof(array[0]));auto it = l.begin();while (it != l.end()){// erase()函数执行后,it所指向的节点已被删除,因此it无效,在下一次使用it时,必须先给
其赋值l.erase(it); ++it;}
}// 改正
void TestListIterator()
{int array[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };list<int> l(array, array+sizeof(array)/sizeof(array[0]));auto it = l.begin();while (it != l.end()){l.erase(it++); // it = l.erase(it);}
}

2.2.2.类模板中类名和类型的问题

类一般只有两种:
普通类 和 类模板
对于普通类: 类名就是类型,是相同的。
对于类模板:类名是类名,给T赋上对应的类型后才是类的类型
class BBB
{int _data;
};
//在这里类名就是类型
//类名:BBB
//类型:BBBtemplate<class T>
class AAA
{T _data;
};
//在这里
//类名是:AAA
//类型是:AAA<T>
但是在类模板里面可以使用类名去代表类型,但是在类外面类名就是类名,类型就是类型。
但是我个人习惯不喜欢,这个特例。

2.2.3.迭代器it的 -> 的访问问题

看一下示例代码
struct Pos
{int _row;int _col;Pos(int row = 0, int col = 0):_row(row), _col(col){}
};void print_list(const zxf2::list<Pos>& lt)
{zxf2::list<Pos>::const_iterator it = lt.begin();while (it != lt.end()){//it->_row++;//这里还能++ ,明明是 const类型的list<Pos>为啥里面的数据可以++,//因为这里又会出现一个问题 T*  和 const T* 的  问题,//const_iterator 对应的应该是 const T&(解引用的返回值不可修改)  和 const T* (it-> 返回值不可修改) 的问题。//iterator 对应的应该是 T& (解引用的返回值可修改)  和  T* (it-> 返回值不可修改) 的问题。//迭代器是什么?//功能类似于指针,可以 * 和 -> 访问指针元素的类模板//他是通过 对 T* 进行封装的得到的一个类。//typedef list_iterator<T, T&, T*> iterator;//普通迭代器:// 重载operator* 的时候 用T&返回。 // 重载operator->  的时候用 T* 返回//typedef list_iterator<T, const T&, const T*> const_iterator;//const迭代器:// operator* 的时候 用const T&返回。// operator-> 的时候用const T* 返回cout << it->_row << ":" << it->_col << endl;++it;}cout << endl;
}void test_list5()
{zxf2::list<Pos> lt;Pos p1(1, 1);lt.push_back(p1);lt.push_back(p1);lt.push_back(p1);lt.push_back(Pos(2, 2));lt.push_back(Pos(3, 3));// int* p  -> *p// Pos* p  -> p->zxf2::list<Pos>::iterator it = lt.begin();//list<Pos>::iterator it2 = it;while (it != lt.end()){it->_row++;//cout << it->;//错误写法。//cout << it.operator->();//it.operator->()->_col++;//cout << (&(*it))->_row << ":" << (*it)._col << endl;cout << it->_row << ":" << it->_col << endl;//cout << it.operator->()->_row << ":" << it->_col << endl;++it;}cout << endl;print_list(lt);
}
首先第一个问题:operator->()如何重载的问题:
        ptr operator->()//ptr是 T* 类型或者 const T* 类型的节点里面存放数据的地址。{return &(_pnode->_data);}
我们说迭代器是一个类似于指针一样的东西,所以如果list节点数据是一个自定义类型不用->,但是如果list节点数据是一个结构体那么 -> 成员变量应该就可以访问到成员,所以应该 it -> 成员变量 就可以访问到。
但是根据我们迭代器->的重载来看的话它返回的是结构的指针,
所以按理来说访问成员应该是 it -> -> 成员变量
但是我们看到在实例中我们访问的时候 直接是使用 it -> 成员变量 ,即可
所以这里编译器做了优化。我们可以看到下面代码都可以实现,对结构体里面对象的访问
        cout << (&(*it))->_row << ":" << (*it)._col << endl;cout << it->_row << ":" << it->_col << endl;cout << it.operator->()->_row << ":" << it->_col << endl;
其实本质就是,编译器把 it -> -> _row 优化为 it ->_row
可以从:it.operator->()->_row 证明得出。
这里是编译器的一个特殊处理。在以后的智能指针中很常用。

相关文章:

【玩转c++】List讲解和模拟底层实现

本期主题&#xff1a;list的讲解和模拟实现博客主页&#xff1a;小峰同学分享小编的在Linux中学习到的知识和遇到的问题小编的能力有限&#xff0c;出现错误希望大家不吝赐1.list的介绍和使用1.1.list的介绍1.list是可以在常数范围内在任意位置进行插入和删除的序列式容器&…...

【Python】特征编码

特征编码1. 独热编码(离散变量编码) sklearn.preprocessing.OneHotEncoder1.1 原理 & 过程1.2 封装函数2. 连续变量分箱(连续变量编码) sklearn.preprocessing.KBinsDiscretizer2.1 原理2.2 等宽分箱 KBinsDiscretizer(strategyuniform)2.3 等频分箱 KBinsDiscretizer(stra…...

前端开发者必备的Nginx知识

nginx在应用程序中的作用 解决跨域请求过滤配置gzip负载均衡静态资源服务器…nginx是一个高性能的HTTP和反向代理服务器&#xff0c;也是一个通用的TCP/UDP代理服务器&#xff0c;最初由俄罗斯人Igor Sysoev编写。 nginx现在几乎是众多大型网站的必用技术&#xff0c;大多数情…...

在 KubeSphere 中开启新一代云原生数仓 Databend

作者&#xff1a;尚卓燃&#xff08;https://github.com/PsiACE&#xff09;&#xff0c;Databend 研发工程师&#xff0c;Apache OpenDAL (Incubating) PPMC。 前言 Databend 是一款完全面向云对象存储的新一代云原生数据仓库&#xff0c;专为弹性和高效设计&#xff0c;为您…...

华为OD机试 - 最优资源分配(C 语言解题)【独家】

最近更新的博客 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南)华为od机试,独家整理 已参加机试人员的实战技巧文章目录 使用说明本期题目:最优资源…...

求数组的中心索引

给你一个整数数组 nums &#xff0c;请计算数组的 中心下标 。 数组 中心下标 是数组的一个下标&#xff0c;其左侧所有元素相加的和等于右侧所有元素相加的和。 如果中心下标位于数组最左端&#xff0c;那么左侧数之和视为 0 &#xff0c;因为在下标的左侧不存在元素。这一点…...

Ubuntu 搭建NextCloud私有云盘【内网穿透远程访问】

文章目录1.前言2.本地软件安装2.1 nextcloud安装2.2 cpolar安装3.本地网页发布3.1 Cpolar云端设置3.2 Cpolar本地设置4.公网访问测试5. 结语1.前言 对于爱好折腾的电脑爱好者来说&#xff0c;Linux是绕不开的、必须认识的系统&#xff08;大部分服务器都是采用Linux操作系统&a…...

如何使用vue创建一个完整的前端项目

搭建Vue项目的完整流程可以分为以下几个步骤&#xff1a;安装Node.js和npm&#xff1a;Vue.js是基于Node.js开发的&#xff0c;因此在开始搭建Vue项目之前&#xff0c;需要先安装Node.js和npm&#xff08;Node.js的包管理器&#xff09;。可以从官网下载Node.js安装包并安装。安…...

http组成及状态及参数传递

http组成及状态及参数传递 早期的网页都是通过后端渲染来完成的&#xff1a;服务器端渲染&#xff08;SSR&#xff0c;server side render&#xff09;&#xff1a; 客户端发出请求 -> 服务端接收请求并返回相应HTML文档 -> 页面刷新&#xff0c;客户端加载新的HTML文档&…...

USART_GetITStatus与 USART_GetFlagStatus的区别

文章目录共同点不同点USART_GetITStatus函数详解USART_GetFlagStatus函数共同点 都能访问串口的SR寄存器 不同点 USART_GetFlagStatus(USART_TypeDef USARTx, uint16_t USART_FLAG)&#xff1a;* 该函数只判断标志位&#xff08;访问串口的SR寄存器&#xff09;。在没有使能…...

Java 系列之 Springboot

系列文章目录 文章目录系列文章目录前言一、Springboot 简介&#xff1f;1.1 什么是启动器&#xff1f;1.2 Springboot 优点1.3 Springboot 核心二、搭建方式2.1 搭建方式一2.2 搭建方式二2.3 搭建方式三三、启动原理3.1 初始化SrpingApplication对象3.2 执行run()方法1. 加载监…...

乐山持点科技:抖客推广准入及准出管理规则

抖音小店平台新增《抖客推广准入及准出管理规则》&#xff0c;本次抖音规则具体如下&#xff1a;第一章 概述1.1 目的及依据为维护精选联盟平台经营秩序&#xff0c;保障精选联盟抖客、商家、消费者等各方的合法权益;根据《巨量百应平台服务协议》、《“精选联盟”服务协议(推广…...

Steam流

Steam流 Stream 流是什么&#xff0c;为什么要用它&#xff1f; Stream是 Java8 新引入的一个包&#xff08; java.util.stream&#xff09;&#xff0c;它让我们能用声明式的方式处理数据&#xff08;集合、数组等&#xff09;。Stream流式处理相较于传统方法简洁高效&#…...

Nuxt实战教程基础-Day01

Nuxt实战教程基础-Day01Nuxt是什么&#xff1f;Nuxt.js框架是如何运作的&#xff1f;Nuxt特性流程图服务端渲染(通过 SSR)单页应用程序 (SPA)静态化 (预渲染)Nuxt优缺点优点缺点安装运行项目总结前言&#xff1a;本教程基于Nuxt2&#xff0c;作为教程的第一天&#xff0c;我们先…...

栈和队列详细讲解+算法动画

栈和队列 栈stack 栈也是一种线性结构相比数组&#xff0c;栈对应的操作数数组的子集只能从一端添加元素&#xff0c;也只能从一端取出元素这一端称为栈顶 栈是一种后进先出的数据结构Last in Firt out(LIFO)在计算机的世界里&#xff0c;栈拥有者不可思议的作用 栈的应用 …...

【Unity3D小技巧】Unity3D中判断Animation以及Animator动画播放结束,以及动画播放结束之后执行函数

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址我的个人博客 大家好&#xff0c;我是佛系工程师☆恬静的小魔龙☆&#xff0c;不定时更新Unity开发技巧&#xff0c;觉得有用记得一键三连哦。 一、前言 在日常开发中&#xff0c;可能会遇到要判断Animation或者Anima…...

【1】熟悉刷题平台操作

TestBench使用 与quartus中testbench的写法有些许。或者说这是平台特有的特性&#xff01;&#xff01; 1 平台使用谨记 &#xff08;1&#xff09;必须删除&#xff1a;若设计为组合逻辑&#xff0c;需将自动生成的clk删除 若不删除&#xff0c;会提示运行超时错误。 &#…...

计算机网络:RIP协议以及距离向量算法

RIP协议 RIP是一种分布式的基于适量向量的路由选择协议&#xff0c;最大优点是简单。要求网络中的每一个路由器都要维护从它自己到其他每一个目的网络的唯一最佳&#xff08;最短&#xff09;距离记录&#xff0c;最多包含15个路由器&#xff0c;距离为16就表示网络不可达&…...

[数据结构与算法(严蔚敏 C语言第二版)]第1章 绪论(课后习题+答案解析)

1. 简述下列概念:数据、数据元素、数据项、数据对象、数据结构、逻辑结构、存储结构、抽象数据类型。 数据 数据是客观事物的符号表示&#xff0c;是所有能输人到计算机中并被计算机程序处理的符号的总称。数据是信息的载体&#xff0c;能够被计算机识别、存储和加工 数据元素…...

JS_countup.js 的简单使用,数字滚动效果

countup.js countup.js 是一个轻量级&#xff0c;无依赖的JavaScript类&#xff0c;通过简单的设置就可以达到数字滚动的效果 官网&#xff1a;https://inorganik.github.io/countUp.js/ 源码 var CountUpfunction(target,startVal,endVal,decimals,duration,options){var …...

【C++知识点】STL 容器总结

✍个人博客&#xff1a;https://blog.csdn.net/Newin2020?spm1011.2415.3001.5343 &#x1f4da;专栏地址&#xff1a;C/C知识点 &#x1f4e3;专栏定位&#xff1a;整理一下 C 相关的知识点&#xff0c;供大家学习参考~ ❤️如果有收获的话&#xff0c;欢迎点赞&#x1f44d;…...

C++---背包模型---装箱问题(每日一道算法2023.3.9)

注意事项&#xff1a; 本题是"动态规划—01背包"的扩展题&#xff0c;dp和优化思路不多赘述。 题目&#xff1a; 有一个箱子容量为 V&#xff0c;同时有 n 个物品&#xff0c;每个物品有一个体积&#xff08;正整数&#xff09;。 要求 n 个物品中&#xff0c;任取若…...

if-else if与switch的练习1:输入两个数,输出两个数的加减乘除的值

1.if-else if的练习 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevice…...

【教程】你现在还不知道微软的New Bing?你out了,快点进来看

哈喽啊&#xff0c;大家好&#xff0c;好久不见&#xff0c;我是木易巷&#xff01; 不禁感叹&#xff0c;AI人工智能时代真的已经来临&#xff01; 目前&#xff0c;谷歌和微软就各自面向大众的产品发布了重大公告。谷歌推出了一款名为Bard实验性对话式 AI 服务&#xff0c;而…...

https流程

ssl加密协议包含以下4个步骤 1、服务器去第三方机构注册生成证书&#xff0c;第三方机构非对称加密生成公钥私钥&#xff0c;给服务器一个私钥&#xff0c;证书包含了公钥。 2、客户端向服务器索要证书 3、客户端向第三方机构验证证书 4、客户端对称加密生成密钥&#xff0c;在…...

python魔法方法

Python中的魔法方法&#xff08;也称为特殊方法或双下划线方法&#xff09;是在类定义中使用的一些特殊的函数,可以使用dir方法查询。它们以双下划线开头和结尾&#xff0c;例如__init__和__str__。这些方法被Python解释器用于执行特定的操作&#xff0c;例如实例化对象、字符串…...

软件测试员如何进行产品测试?

一般来讲&#xff0c;当软件成为一个成功的产品后&#xff0c;产品测试工作就会复杂很多。比如拥有的用户量大&#xff0c;迭代频繁&#xff0c;测试的周期短&#xff0c;重复性强。面对紧张复杂的产品测试工作&#xff0c;软件测试员应怎样完成这一系列的测试工作呢&#xff1…...

计算机网络基础知识点【1】

文章目录计算机网络第一章 计算机网络参考模型1.计算机网络为什么需要分层&#xff1f;1.1 分层思想1.2 分层好处2.OSI七层模型2.1 OSI七层模型总结2.2 OSI七层工作原理2.3 数据封装与解封装2.4 计算机网络常用协议3.TCP/IP参考模型3.1 什么是TCP/IP协议3.2 TCP/IP协议族的组成…...

c++ 中标准库类型 string 详解

&#x1f441;‍&#x1f5e8;&#x1f441;‍&#x1f5e8; 前言 标准库类型string 表示可变长的字符序列&#xff0c;使用string 类型必须首先包含string 头文件。string 定义在命名空间std 中。 定义和初始化 string 对象 首先说明如何初始化对象是由类本身决定的&#xff0…...

Html新增属性之拖拽(drag)

元素在拖放过程中触发的事件 HTML5中&#xff0c;只要将元素的 draggable 属性设置为 true 就可以实现拖放功能&#xff0c;在拖放过程中&#xff0c;触发了多个事件&#xff0c;如下&#xff1a; dragstart:事件主体是被拖放元素&#xff0c;在开始拖放被拖放元素时触发。dra…...