自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(118)
  • 收藏
  • 关注

原创 C++复习过程中零碎知识点(查漏补缺, 持续更新)

1. 命名空间三种使用方式 using N::d using namespace N N::d2. inline与const代替宏3. 构造 析构 拷贝 赋值 两种取地址4. 构造函数可以重载5. 函数重载底层实现 extern “C”6. 预处理 编译 汇编 链接7. class与strut 大小计算8. 大小端区分9. 引用之间const关系10. 拷贝函数传引用11. 引用 const 自定义类型 初始化列表 初始化顺序12. explicit防无名对象 可读性13. stat

2020-08-06 17:41:41 215

转载 web到底是什么?

什么是web所谓网站(Website),就是指在网际网路(因特网)上,根据一定的规则,使用HTML等工具制作的用来展示特定内容的相关网页的集合。简单地说,网站是一种通讯工具,就像布告栏一样,人们可以通过网站来发布自己想要公开的资讯(信息),或者利用网站来提供相关的网路服务(网络服务),又或收集想要的信息。人们可以通过网页浏览器来访问网站,获取自己需要的资讯(信息)或者享受网路服务。简单来说,web是一系列网页资源的集合,类似于布告栏,使得别人可以通过网络访问自己从而达到某种目的。什么是网页现在在你眼

2020-10-23 08:54:33 3148

原创 乐观锁悲观锁CAS锁自旋锁你了解吗?

文章目录一,概念,使用场景1. 乐观锁2. 悲观锁3. 适用场景二,实现方式1. 版本号机制2. CAS锁3. 乐观锁的缺点1)ABA问题2)循环时间长开销大3)只能保证一个共享变量的原子操作一,概念,使用场景1. 乐观锁总是假设最好的情况,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号机制和CAS算法实现。乐观锁适用于多读的应用类型,这样可以提高吞吐量,像数据库提供的类似于write_condition机制,其实都是提

2020-10-19 21:04:24 472

原创 如何避免死锁(死锁检测算法) —— 银行家算法

一,死锁概念死锁指的是两个或两个以上的进程在对临界资源竞争或者通信过程中, 因为某些处理不当,而造成各个进程彼此等待,无法继续向下推进,此使系统处于死锁状态, 这些互相等待的进程成为死锁进程。二,死锁产生必要条件1. 互斥条件指进程对所分配到的资源进行排它性使用,即在一段时间内某资源只由一个进程占用。如果此时还有其它进 程请求资源,则请求者只能等待,直至占有资源的进程用毕释放。2. 请求和保持条件指进程已经保持至少一个资源,但又提出了新的资源请求,而该资源已被其它进程占有,此时请求

2020-10-19 20:07:05 1549

原创 计算机网络 —— 网络安全

网络安全问题概述我们通过一个简单的端口扫描工具,再加上一个破解密码的工具就可以轻易的入侵别人的计算机,但是对于底层原理,即使不是从事网络安全的程序员们,其实都得多多少少了解一点。网络安全问题分类数据安全应用安全操作系统安全物理安全截获(被动攻击)中断 篡改 伪造(主动攻击)网络危害分类病毒 更改系统设置 通过别的软件带入的蠕虫 消耗系统资源 慢慢吃cpU木马 程序执行的功能超出声称的功能(外界通信)逻辑炸弹 某种条件下触发两类密码体制数据加密一般通过密钥+加密算法进行,这是

2020-10-19 18:10:20 607

原创 计算机网络 —— 应用层详解

文章目录一,应用层概念二,应用层所提供的服务1. DNS 域名解析协议1)什么是域名2)域名层次3)域名解析流程5)部署DNS服务器2. DHCP 动态主机配置协议1)静态IP地址,动态IP地址2) 动态IP请求过程3. HTTP(详细)统一资源定位符URL4. FTP文件传输协议5. TELNET远程终端协议/RDB远程桌面协议6. SMTP/POP3/IMAP 收发邮件使用一,应用层概念位于计算机网络体系结构的最上层,前面四层做的所有事情就是为了他服务,他也是设计和建立计算机网络的最终目的,通俗的

2020-10-18 17:36:13 2184 2

原创 计算机网络 —— 传输层详解

文章目录端口号端口号划分UDP协议UDP协议格式UDP协议特性解析UDP不粘包UDP使用注意事项基于UDP的应用层协议(了解)TCP协议TCP协议格式TCP协议特性解析面向连接三次握手建立连接四次挥手断开连接连接保活机制可靠传输确认应答机制,超时重传机制与数据有序完整交付其他丢包问题处理滑动窗口机制拥塞控制提高传输性能的方式快速重传协议延迟应答协议捎带应答协议面向字节流面向字节流优缺点粘包解决方案其他netstatpidofTCP异常情况TCP与UDP简单对比端口号端口号(Port)标识了一个主机上进行

2020-10-18 16:07:47 582

原创 计算机网络 —— 网络层详解

文章目录一,网络层提供的服务网络互联设备及其解决的问题二,网际协议 IP1. 虚拟互联网2. IP地址(IPV4)1)IP地址分类2)子网掩码3) 划分子网与构造超网(无分类编址CIDR)3. IP地址与MAC地址的关系4. IP数据报格式三,ARP协议1. ARP协议的作用2. 使用ARP的四种典型情况3. 逆地址解析协议RARP4. ARP欺骗/p2p终结者/网络执法官/ARP防火墙四,ICMP与IGMP协议1. ICMP2. IGMP五,动态路由管理六,NAT与PAT,NAPT技术一,网络层提供的服

2020-10-17 18:21:23 965

原创 计算机网络 —— 链路层详解

文章目录一,数据链路层基本概念1. 为什么要设置数据链路层2. 数据链路的主要功能1)链路管理2)帧同步3)流量控制4)差错控制5)透明传输6)寻址3. 链路层的三个基本问题1)封装成帧2)透明传输3)差错控制4. 一些零散链路层概念二,两种情况下的数据链路层1. 使用点对点信道的数据链路层(广域网)1)PPP2)HDLC3)两种协议对比2. 使用广播信道的数据链路层(局域网)1)局域网拓扑划分2)CSMA/CD三,以太网1. 以太网标准2. 以太网提供的服务3. 扩展以太网1)以太网的拓扑2)扩展方式4.

2020-10-15 19:12:12 4745

原创 谢希仁计算机网络学习笔记链接

【计算机网络】第一章:计算机网络概述https://blog.csdn.net/iwanderu/article/details/103795715【计算机网络】第二章:物理层 https://blog.csdn.net/iwanderu/article/details/103802457【计算机网络】第三章:数据链路层 https://blog.csdn.net/iwanderu/article/details/103812828【计算机网络】第四章:网络层 https://blog.csdn.ne

2020-10-09 17:51:36 158

原创 计算机网络 —— 计算机网络概述

计算机网络基本概念计算机网络计算机网络是通信技术与计算机技术紧密结合的产物,计算机网络就是一种通信技术。计算机网络重要特点:连通, 共享因特网就是全世界最大的互联网。ISP端系统通过接入ISP(互联网服务提供商,Internet Service Provider)连接到Internet。比如移动,电信,联通就是较大的ISP服务提供商。局域网 广域网局域网和广域网是按规模大小而划分的两种计算机网络。范围在几千米以内的计算机网络统称为局域网;而连接的范围超过10千米的,则称为广域网,因特网

2020-10-09 16:25:22 832

原创 STL —— vector,list,deque,使用与优缺点比较

关于vector list deque 已经做过介绍,本文是对三种容器的优劣做出比较。下面是vector list deque的博客链接vectorlistdequevector/list对比底层结构动态顺序表,一段连续空间带头结点的双向循环链表随机访问支持随机访问,访问某个元素效率O(1)不支持随机访问,访问某个元素效率O(N)插入和删除任意位置插入和删除效率低,需要搬移元素,时间复杂度为O(N),插入时有可能需要增容,增容:开辟新空间,拷贝元素,释放旧空间,导致效率更

2020-09-27 17:51:58 387

原创 带你攻克STL ——如何正确使用deque(深入理解deque底层)

deque介绍deque(双端队列):是一种双开口的"连续"空间的数据结构。双开口的含义是:可以在头尾两端进行插入和删除操作,且时间复杂度为O(1),与vector比较,头插效率高,不需要搬移元素;与list比较,空间利用率比较高。deque容器的存储结构deque并不是真正连续的空间,而是由一段段连续的小空间拼接而成的,实际deque类似于一个动态的二维数组,其底层结构如下图所示:和 vector 容器采用连续的线性空间不同,deque 容器存储数据的空间是由一段一段等长的连续空间构成,各段空间

2020-09-27 17:43:20 1872

原创 STL —— priority_queue容器用法简介

文章目录priority_queue介绍使用模拟实现priority_queue介绍优先队列是一种容器适配器,根据严格的弱排序标准,它的第一个元素总是它所包含的元素中最大的。(默认大堆)此上下文类似于堆,在堆中可以随时插入元素,并且只能检索最大堆元素(优先队列中位于顶部的元素)。优先队列被实现为容器适配器,容器适配器即将特定容器类封装作为其底层容器类,queue提供一组特定的成员函数来访问其元素。元素从特定容器的“尾部”弹出,其称为优先队列的顶部。底层容器可以是任何标准容器类模板,也可以是其他特

2020-09-26 16:33:13 397

原创 STL —— queue容器用法简介

介绍C++队列queue模板类的定义在头文件中,queue 模板类需要两个模板参数,一个是元素类型,一个容器类型,元素类型是必要的,容器类型是可选的。C++队列queue是一种容器适配器,它给予程序员一种先进先出(FIFO)的数据结构。下图展示了一个 queue 容器及其一些基本操作:queue 的生成方式和 stack 相同,下面展示如何创建一个保存字符串对象的 queue:std::queue<std::string> words;也可以使用拷贝构造函数:std::queue

2020-09-26 16:20:34 292

转载 STL —— stack容器用法简介

文章目录一、简介二、函数用法示例三、结语一、简介stack是一种容器适配器(STL的容器分为顺序容器和关联容器,容器适配器,是对这两类容器进行包装得到的具有更强的约束力的容器),被设计来用于操作先进后出(FILO)结构的情景,在这种情况下, 元素的插入和删除都只能在容器的尾部进行。stack通过容器适配器来实现,是一种将特定的容器类作为其最底层的容器的类,它提供了一些特定的成员函数来访问自己的元素,元素只能在这个特定容器的后面,也就是栈的顶部,进行出栈和入栈操作。最底层的容器可以是任意一种标准的容器

2020-09-26 16:08:46 462

原创 带你攻克STL —— 如何正确使用list(重难点剖析及其模拟实现)

文章目录list介绍正确使用list构造函数iteratorlist 其他常用接口迭代器失效问题list模拟实现list介绍简单理解list,list就是一个封装了的双向链表,使得用户可以更加便捷使用。list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后一个元素。list与forward_list非常相似:最主要的不同在于forward_list

2020-09-26 15:38:40 189

原创 带你攻克STL —— 如何正确使用vector (重难点剖析及其模拟实现)

文章目录vector介绍正确使用vecotr初始化iterator空间问题扩容机制resize 和 reversevector 其他常用接口迭代器失效问题vector模拟实现vector介绍c++官方文档定义简单来说,vector就是一个被封装了的类, 这个类实例化的对象可以存储各种类型的成员,通过类中的成员函数我们可以高效的操作我们的数据。vector是表示可变大小数组的序列容器。就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问,和

2020-09-26 15:02:51 568

原创 带你彻底理解大端小端,结构体内存对齐

大端小端小端存储:数据的低字节存储在地址空间的低字节位,数据的高字节存储在地址空间的高字节位。大端存储:数据的低字节存储在地址空间的高字节位,数据的高字节存储在地址空间的低字节位。因为现代PC大多采用小端字节序,小端字节序又被称为主机字节序。大端字节序也称为网络字节序。判断计算机是小端还是大端的核心点:1、取出int类型低字节存于char,对比取出的低位存放的数据跟整个int类型数据的值。2、跟据联合体特点,所有成员共享内存空间。特别的:网络字节序是大端模式。#include <s

2020-09-24 19:23:24 978

原创 C++ —— 内存管理详解

文章目录内存分配堆与栈的区别静态变量与非静态变量动态内存管理内存泄漏内存泄漏分类危害 和 预防内存分配栈又叫堆栈,非静态局部变量/函数参数/返回值等等,栈是向下增长的。内存映射段是高效的I/O映射方式,用于装载一个共享的动态内存库。用户可使用系统接口创建共享共享内存,做进程间通信。堆用于程序运行时动态内存分配,堆是可以上增长的。数据段–存储全局数据和静态数据。代码段–可执行的代码/只读常量。堆与栈的区别管理方式不同 :栈是由编译器自动申请和释放空间,堆是需要程序员手动申请和释放;空

2020-09-21 17:05:28 896

原创 C++ —— 友元,内部类以及cin cout重载的实现

友元在C++中,我们使用类对数据进行了隐藏和封装,类的数据成员一般都定义为私有成员,成员函数一般都定义为公有的,以此提供类与外界的通讯接口。但是,有时需要定义一些函数,这些函数不是类的一部分,但又需要频繁地访问类的数据成员,这时可以将这些函数定义为该函数的友元函数。除了友元函数外,还有友元类,两者统称为友元。作用: 提高了程序的运行效率(即减少了类型检查和安全性检查等都需要时间开销),但它破坏了类的封装性和隐藏性,使得非成员函数可以访问类的私有成员。友元函数友元函数是可以直接访问类的私有成员的非成员

2020-09-21 16:08:45 494

原创 C++ —— 深入浅出带你理解类和对象

文章目录类的空间存储匿名对象this指针六大默认成员函数构造函数析构函数拷贝构造函数赋值运算符重载const与非const取地址重载exlicit关键字static与类和对象类的空间存储匿名对象this指针六大默认成员函数构造函数析构函数拷贝构造函数赋值运算符重载const与非const取地址重载exlicit关键字static与类和对象...

2020-09-21 09:58:35 188

原创 C++ —— 理解引用及其原理

概念引用的简单概念: 引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间。引用一般被使用做参数/返回值这样可以提高效率, 减少拷贝。底层实现在语言层面引用是一个对象的别名不占据空间, 但是实际上在底层的实现上引用是类似于指针实现的。我们借助代码进行探索int i=5;int &ri=i;ri=8;通过:调试->窗口->反汇编int i=5;00A013DE mov dword

2020-09-19 18:44:59 1328

原创 C++ —— 函数重载,extern“C“,缺省参数

概念函数重载:是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数 或 类型 或 顺序)必须不同,常用来处理实现功能类似数据类型不同的问题。也就说在同一作用域下通过名称相同,参数不同实现函数的区分。底层实现c++名字修饰规则:实际我们的项目通常是由多个头文件和多个源文件构成,而通过我们C语言阶段学习的编译链接,我们可以知道,【当前a.cpp中调用了b.cpp中定义的Add函数时】,编译后链接前,a.o的目标文件中没有Add的函数地址,因为Ad

2020-09-19 18:13:01 270

原创 经典八大排序算法总结

排序算法分类排序算法具体实现及其思想https://blog.csdn.net/ifwecande/category_9491907.html本专栏针对不同排序算法已经整理好了博客。这里不加赘述。时间空间复杂度及其稳定性分析

2020-09-14 20:35:33 99

原创 插入排序——直接插入排序,希尔排序 思想及其实现

我们将数组中的数据分为两个区间,已排序区间和未排序区间。初始已排序区间只有一个元素,就是数组的第一个元素,然后在未排序区间中依次取出元素并插入到已排序区间的合适位置,并保证已排序区间一直是有序。重复这个步骤直到未排序区间元素为空,算法结束插入排序步骤:从第一个元素开始,该元素可以认为已经被排序取出下一个元素,在已经排序的元素序列中从后向前扫描如果该元素(已排序)大于新元素,将该元素移到下一位置重复步骤3,直到找到已排序的元素小于或者等于新元素的位置将新元素插入到该位置后重复步骤2~5对于

2020-09-14 20:14:23 128

原创 简简单单选择排序

思想选择排序思想很简单, 但是发现网上有些人讲的和冒泡,插入含糊在一起了,这里贴上自己的理解。选择排序:实现

2020-09-14 16:03:58 98

原创 简简单单的冒泡排序

思想冒泡排序(BubbleSort)以其“在排序过程中相邻元素不断交换,一些元素慢慢被换到最后,看起来就像是元素在冒泡一样”而得名,是一种简单的基于关键词比较的排序算法。冒泡排序的原理(以递增序为例)是每次从头开始依次比较相邻的两个元素,如果后面一个元素比前一个要大,说明顺序不对,则将它们交换,本次循环完毕之后再次从头开始扫描,直到某次扫描中没有元素交换,说明每个元素都不比它后面的元素大,至此排序完成。实现void BubbleSort(int* a, int n){//降序 for(int j

2020-09-14 15:27:51 93

原创 归并排序的思想与实现(递归与迭代)

归并排序的思想核心思想:归并排序是利用归并的思想实现的排序方法,该算法采用经典的分治策略(分治法将问题分成一些小的问题然后递归求解,而治的阶段则将分的阶段得到的各答案”修补”在一起,即分而治之)。如图:对于有序的两个数组我们可以很容易的进行有序合并,那么我们基于分治的思想, 我们将无序的数组进行分割, 直到分成一个元素,重新进行合并。稳定性 归并排序是一种稳定的排序。存储结构要求 可用顺序存储结构。也易于在链表上实现。时间复杂度 对长度为n的文件,需进行趟二路归并,每趟归并的时间为O(n

2020-09-14 15:06:58 309

原创 快排的迭代,递归实现及其优化

快排的思想首先 快排是一种比较排序。具体思想是 选出一个基准值,通过比较找出待排序区间中基准值该放置的位置。实现逻辑:先从数列中取出一个数作为基准数(通常取第一个数)。分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。再对左右区间重复第二步,直到各区间只有一个数。分区的三种方式通常有三种方式来进行基准数的左右分区。左右指针法。挖坑法前后指针法。左右指针实现://左右指针法int PartSort(int* a, int begin, int end

2020-09-14 14:52:32 651 1

原创 深入理解堆 —— 堆的底层实现,堆排序,TopK问题

概念结构特点堆(数据结构)逻辑上:完全二叉树物理上:数组堆是一种顺序存储结构(采用数组方式存储),仅仅是利用完全二叉树的顺序结构的特点进行分析。结点下标计算公式(根节点从0开始)已知二叉树根结点的下标是root,那么它左孩子的下标left=2root+1,右孩子的下标right=2root+2。已知孩子结点的下标(不区分左右)为child,那么双亲的下标为(child-1)/2。如果从1开始,则已知root,则左孩子节点left=2root+1,right=2root+2。已知chil

2020-09-10 15:20:51 886

原创 深入了解c++智能指针(RAII思想)

内存泄漏内存泄漏概念内存泄漏指因为疏忽或错误造成程序未能释放已经不再使用的内存的情况。内存泄漏并不是指内存在物理上的消失,而是应用程序分配某段内存后,因为设计错误,失去了对该段内存的控制,因而造成了内存的浪费。内存泄露危害内存泄漏的危害:长期运行的程序出现内存泄漏,影响很大,如操作系统、后台服务等等,出现内存泄漏会导致响应越来越慢,最终卡死内存泄漏分类C/C++程序中一般我们关心两种方面的内存泄漏:堆内存泄漏(Heap leak)堆内存指的是程序执行中依据须要分配通过malloc / c

2020-08-13 19:49:37 265

原创 剑指 Offer 35. 复杂链表的复制

题目描述思路分析原链表上进行修改,完成next和random之后,从原链表分离。代码展示/*// Definition for a Node.class Node {public: int val; Node* next; Node* random; Node(int _val) { val = _val; next = NULL; random = NULL; }};*/class So

2020-08-11 17:16:17 105

原创 剑指 Offer 36. 二叉搜索树与双向链表

题目描述思路分析dfs保存遍历结果,重新新建链表进行连接,不推荐。但是可以根据二叉树的特点,left和right直接dfs改变指向。代码展示/*// Definition for a Node.class Node {public: int val; Node* left; Node* right; Node() {} Node(int _val) { val = _val; left = NULL;

2020-08-11 16:37:57 110

原创 C++ —— 代替宏的inline内联函数与const

内联函数在C++中宏函数的概念是使用内联函数来实现的,而无论从哪一方面来说,内联函数都是真正的函数。唯一不同之处是内联函数在适当的地方像宏一样展开,所以不需要函数调用的开销。任何在类中定义的(在花括号内)函数会自动地成为内联函数;开栈的开销 > 执行的开销 建议设为inline开栈的开销 < 执行的开销 不建议 代码膨胀注意事项对于那些函数体代码量很小,又经常调用的函数,一般用作内联函数。因为函数体代码很小,函数体执行的时间远小于调用函数的时间,从而提高代码执行效率。一

2020-08-11 11:14:31 431

原创 详解vector,list,deque,使用与优缺点比较

vector/list对比底层结构动态顺序表,一段连续空间带头结点的双向循环链表随机访问支持随机访问,访问某个元素效率O(1)不支持随机访问,访问某个元素效率O(N)插入和删除任意位置插入和删除效率低,需要搬移元素,时间复杂度为O(N),插入时有可能需要增容,增容:开辟新空间,拷贝元素,释放旧空间,导致效率更低任意位置插入和删除效率高,不需要搬移元素,时间复杂度为O(1)空间利用率底层为连续空间,不容易造成内存碎片,空间利用率高,缓存利用率高底层节点动态开辟,小节点容易

2020-08-10 16:55:58 621

原创 深入了解string的深浅拷贝,写时拷贝

c++中类中有默认的构造函数,其中就有拷贝构造,默认的拷贝构造按照字节进行拷贝,按字节拷贝的问题在于:如果该空间为指针变量,且指向一块正在管理的空间,当浅拷贝之后,就会有两个变量同时管理这块空间,当生命周期结束后,也会随之析构两次,这是不允许的。因此这种情况下,我们需要手动实现拷贝构造,简单来说,我们需要开辟空间,将原来管理的空间赋值一份,这样,一人一份就没有纠纷了。string深拷贝的实现,以及传深拷贝统写法与现代写法。#define _CRT_SECURE_NO_WARNINGS#includ

2020-08-09 17:49:39 628

原创 并查集详解 —— c++实现

并查集原理将不同元素划分到不同的集合,开始时, 每个元素就是一个集合,然后按照一定的规律进行集合的合并,这样就可以查找集合的数目,元素的归属,将复杂问题简化。并查集应用1. 查找元素属于哪一个集合2. 查看两个元素是否在同一个集合3. 合并两个集合4. 集合的个数并查集实现class UnionFindSet {public: UnionFindSet(size_t number) { _ufs.resize(number, -1); } int FindRoot(int ind

2020-08-09 12:41:53 293

原创 剑指 Offer 32 - II. 从上到下打印二叉树 II

题目描述思路分析递归迭代均可,递归加上level显示当前深度代码展示/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution {publ

2020-08-09 08:59:41 128

原创 剑指 Offer 32 - I. 从上到下打印二叉树

题目描述思路分析双栈迭代代码展示/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution {public: void _help

2020-08-09 08:49:08 112

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除