- 博客(48)
- 收藏
- 关注
原创 Vector
一、vector介绍vector是表示可变大小数组的序列容器。就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问,和数组一样高效。但是又不像数组,它的大小是可以动态改变的,而且它的大小会被容器自动处理。本质讲,vector使用动态分配数组来存储它的元素。当新元素插入时候,这个数组需要被重新分配大小为了增加存储空间。其做法是,分配一个新的数组,然后将全部元素移到这个数组。就时间而言,这是一个相对代价高的任务,因为每当一个新的元素加入到容器的时
2021-11-04 15:43:00 508
原创 Liunx-基础IO
一、C语言操作文件接口FILE *fopen(const char *path,const char *mode) ;path :待打开的文件(文件路径+文件名称)mode :以何种方式打开r:以只读方式打开,当文件不存在的时候,就会打开失败r+:以读写方式打开,当文件不存在的时候,就会打开失败w:以只写方式打开,如果文件不存在,则创建文件。如何文件存在,则会截断(清空)文件w+:以读写方式打开,如果文件不存在,则创建文件。如何文件存在,则会截断(清空)文件a:以追加方式打开,只支持写
2021-11-03 20:54:46 194
原创 C++之模板初阶
一、泛型编程泛型编程:编写与类型无关的通用代码,是代码复用的一种手段。模板是泛型编程的基础模板:告诉编译器一个模子,让编译器根据不同类型利用该模子生成代码模板分为:函数模板和类模板二、 函数模板1、函数模板概念函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型产生函数的特定类型版本。2、函数模板格式template<typename T1, typename T2,…,typename Tn>返回值类型 函数名(参数列表){}templ
2021-09-23 14:27:54 351 1
原创 C++内存管理
一、C/C++内存分布栈又叫堆栈,非静态局部变量/函数参数/返回值等等,栈是向下增长的。内存映射段是高效的I/O映射方式,用于装载一个共享的动态内存库。用户可使用系统接口创建共享共享内存,做进程间通信。堆用于程序运行时动态内存分配,堆是可以向上增长的。数据段–存储全局数据和静态数据。代码段–可执行的代码/只读常量。二、C语言中动态内存管理方式:1、malloc/calloc/realloc区别:共同点:都是C语言中用来进行动态内存申请的库函数,申请的空间都在堆上,用完之后必须使用f
2021-09-22 22:19:15 255 1
原创 小知识点的总结
参数检测:有些情况下使用assert:该种问题如果发生,程序是一种错误—除法的除数为0有些情况下使用if判断:该总问题如果发生,程序是一种正常的情况-…->比如:空链表-…>合法的链表,只不过链表中没有节点而已对于链表的基本操作中,那些方法需要传递二级指针,那些方法需要传递一级指针?本质:在函数体中是否需要通过形参指针改变外部实参指针的指向需要:函数的参数必须为二级指针,比如:所有的插入、删除、销毁。。。不需要:函数的参数只需要传递一级指针,比如:查找、获取有效个数节点。。.
2021-07-12 11:07:56 97
原创 常见排序算法的实现
1、插入排序:基本思想:直接插入排序是一种简单的插入排序法,其基本思想是:把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为止,得到一个新的有序序列。直接插入排序:当插入第i(i>=1)个元素时,前面的array[0],array[1],…,array[i-1]已经排好序,此时用array[i]的排序码与array[i-1],array[i-2],…的排序码顺序进行比较,找到插入位置即将array[i]插入,原来位置上的元素顺序后移。直接插入排序
2021-07-12 11:06:41 296
原创 二叉树链式结构
一、二叉树链式结构的遍历1、概念:所谓遍历(Traversal)是指沿着某条搜索路线,依次对树中每个结点均做一次且仅做一次访问。访问结点所做的操作依赖于具体的应用问 题。 遍历是二叉树上最重要的运算之一,是二叉树上进行其它运算之基础。遍历:按照某种规则,对二叉树中的每个节点进行相应的操作(打印、每个节点值+1),并且每个节点只能操作一次2、前序/中序/后序的递归结构遍历:是根据访问结点操作发生位置命名NLR:前序遍历(Preorder Traversal 亦称先序遍历)——访问根结点的操作发生
2021-07-05 20:42:44 330 2
原创 二叉树-堆
一、堆的概念及结构如果有一个关键码的集合K = {k0,k1, k2,…,kn-1},把它的所有元素按完全二叉树的顺序存储方式存储在一个一维数组中,并满足:Ki <= K2i+1 且 Ki<= K2i+2 (Ki >= K2i+1 且 Ki >= K2i+2) i = 0,1,2…,则称为小堆(或大堆)。将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根堆。堆的性质:堆中某个节点的值总是不大于或不小于其父节点的值;堆总是一棵完全二叉树。...
2021-07-05 11:11:03 326 3
原创 栈和队列练习题
一、有效的括号给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串 s ,判断字符串是否有效。有效字符串需满足:1、左括号必须用相同类型的右括号闭合。2、左括号必须以正确的顺序闭合。示例 1:输入:s = “()” 输出:true示例 2:输入:s = “()[]{}” 输出:true示例 3:输入:s = “(]” 输出:false示例 4:输入:s = “([)]” 输出:false示例 5:输入:s = “{[]}” 输出:true提示:1 <
2021-07-04 16:17:36 646 1
原创 数据结构-链表
一、概念链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表是一种有序的列表。链表的内容通常存储与内存中分散的位置上。链表由节点组成,每一个结点的结构都相同。节点分为数据域或链域,数据域顾名思义就是存放节点的内容,链域存放的是下一个节点的指针,也就是螳螂捕蝉黄雀在后的道理。链表结构1、单向、双向2、带头、不带头3、循环、非循环1. 无头单向非循环链表:结构简单,一般不会单独用来存数据。实际中更多是作为其他数据结构的子结 构,如
2021-07-03 16:30:11 1020 1
原创 链表练习题
一、移除链表元素给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。提示:列表中的节点数目在范围 [0, 104] 内1 <= Node.val <= 500 <= val <= 50```cstruct ListNode* removeElements(struct ListNode* head, int val){ struct ListNode* cur=h
2021-07-01 19:04:21 512 1
原创 数据结构-顺序表
一、概念及结构顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组上完成为数据的增删查改。顺序表一般可以分为:1、静态顺序表:使用定长数组存储2、动态顺序表:使用动态开辟的数值存储//顺序表的静态存储#define N 100typedef int SLDataType;typedef struct SeqList{ SLDataType array[N];//定长数组 size_t size;//有效数据的个数
2021-06-29 21:08:59 441
原创 时间复杂度&空间复杂度
一、什么是数据结构?数据:比如一个班级的学生信息,不是只有1,2,3,4等才是数据结构:组织关系数据结构:数据和数据之前的组织关系二、时间复杂度&空间复杂度1、衡量一个算法的好坏:通过算法的复杂度来进行衡量的2、算法效率算法效率分为两种:第一种是时间效率,第二种是空间效率。时间效率就是时间复杂度,空间效率就是空间复杂度。时间复杂度主要衡量的是一个算法的运行速度,空间复杂度主要衡量得是一个算发所需要的额外空间。3、时间复杂度概念:是一个关于问题规模N的数学表达式,计算算法中某条
2021-06-29 16:36:46 159 1
原创 socket套接字编程(二)
一、客户端程序中流程的特殊之处客户端通常不推荐用户自己绑定地址信息,而是让操作系统在发送数据的时候发现socket还没有绑定地址,然后自动选择一个合适的ip地址和端口进行绑定1.如果不主动绑定,操作系统会选择-个合适的地址信息进行绑定(什么地址就是合适的地址? — 当前没有被使用的端口)一个端口只能被一个进程占用, 若用户自己指定端口以及地址进行绑定有可能这个端口已经被使用了,则会绑...
2020-03-19 21:54:49 249
原创 socket套接字编程
一、socket概念socket是一套网络编程接口,类似于中间件;上层用户可以通过这些接口简单的完成网络通信传输; 而不需要过于关心内部的实现过程套接字编程讲的就是使用socket接口实现网络通信socket编程: tcp/udp传输层有两个协议: tcp/udp; 这两个协议特性各有不同,因此实现流程也稍有差别;因此需要分开来讲udp:用户数据报协议:无连接,不可靠,面向数据报;...
2020-03-08 20:52:01 343
原创 网络基础1
一、网络的发展 : 单机 -> 网络使用路由器/交换机这种设备将多个计算机连接起来实现数据交换–小型的网络小型网络的互相连接数据交换----更大的网络网络以覆盖范围划分:1、局域网/城域网/广域网2、互联网/因特网3、以太网/令牌环网–组网方式二、IP地址:在网络中必须能够唯一表示每一台主机,才能实现点到点的精确通信IP地址:IPv4: uint32_ t 无...
2020-03-08 20:30:04 240
原创 线程池
线程池–线程的池子(很多线程)场景:淘宝–双十一—很多剁手者,都会买东西,向淘宝发出购物请求—淘宝服务器就要针对这些请求进行处理服务器上肯定是多执行流并行/并发处理若是请求来了就创建执行流进行处理,存在两个问题:1.若峰值压力下,会创建线程过多,有可能导致资源耗尽2.任务处理过程中,线程的创建与销毁成本过高在服务器启动的时候,就创建大量线程+创建一个线程安全的队列作为线程池任务来了,...
2020-03-08 20:11:16 157
原创 生产者与消费者模型
一、生产者与消费者模型:一种设计模式----大佬们针对典型场景设计的解决方案二、生产者与消费者模型所解决的问题:解耦和,支持并发,支持忙闲不均三、生产者与消费者模型的实现:生产者与消费者只是不同角色的执行流;只需要中间实现线程安全的队列,然后再各自创建不同角色的执行流就可以实现这个模型四、线程安全的阻塞队列的实现:使用c++封装实现一个阻塞队列类:: stI中我们学习了队列容器st...
2020-02-28 17:20:50 210
原创 线程安全
一、线程安全1、概念:多个执行流对临界资源进行争抢访问,而不会造成数据二义或者逻辑混乱;称这段争抢访问的过程是线程安全的;线程安全的2、实现:如何保证多个执行流对临界资源进行争抢访问而不会造成数据二义3、同步:通过条件判断,实现对临界资源访问的时序合理性4、互斥:通过唯一访问,实现对临界资源访问的安全性互斥的实现技术:互斥锁/信号量实现互斥的原理:只要保证同一时间只有一个执行流能够...
2020-02-24 20:59:09 154
原创 线程控制
一、线程创建int pthread_create(pthread_ t *tid, pthread_attr t attr, void(*thread routine) (void *arg),void *arg)1>tid:输出型参数,用于向用户返回线程id,是后续线程操作的句柄2>attr:用于设置线程属性,通常置NULL3>thread_routine: 线程...
2020-02-22 18:25:20 148
原创 线程概念
一、多线程多线程的处理思路:一个运行中的程序中,具有多个执行流,各自完成一个功能模块的实现linux的操作系统中:认为一个pcd就是一个执行流(pcd是操作系统调用一段程序运行的 实体–描述了程序的运行过程)linux下的线程就是一个pcdpcd:是一个进程现在,多个pcd可以共用同一个虚拟地址空间,这些pcd共用了一个运行中程序的资源linux下的线程就是一个pcd是...
2020-02-22 17:40:50 173
原创 进程信号
一、信号1、作用:通知别人,发生了某件事情,尽快的去处理这件事情(操作系统通知进程发生了某个事件,打断进程当前操作,去处理这个事件)2、信号是什么:软件中断信号想要成为一个中断,首先我们必须认识这个信号,并且知道如何去处理它事件多种多样,因此信号也是多种多样3、查看操作系统中定义好的信号:使用kil -l命令可以查看信号种类:用户所能看到并使用的信号共有62种,两大分类:1~31...
2020-02-21 17:56:54 210
原创 共享内存
共享内存一、概念:将同一块物理内存映射到进程各自的虚拟地址空间中就可以实现数据共享,因为 都可以通过自己的虚拟地址进行访问二、特性:1、最快的进程间通信方式因为共享内存直接通过虚拟地址访问物理内存,进行数据共享而其它通信方式,需要先将数据拷贝入内核,再从内核拷贝出来,才能实现通信因此共享内存的通信相较于其它方式,少了两次数据拷贝操作,因此速度最快共享内存的代码操作:1....
2020-02-20 18:06:02 1152
原创 Linux-进程控制
一、进程创建pid_t fork(void)流程:clone()1、创建pcb;2、复制信息;3、内存数据发生改变的时候为子进 程重新开辟空间,拷贝数据(写时拷贝技术)pid_t vfork(void)------创建一个子进程,父子进程共用同一个虚拟地址空间共用同一块虚拟地址空间,使用同一个栈,会造成调用栈混乱因此父进程调用vfork创建子进程,会被阻塞,直到子进程exit(...
2020-02-18 17:23:03 229
原创 Linux-进程概念
系统编程:系统调用接口以及进程的认识(一个程序的运行)一、认识冯诺依曼体系结构冯诺依曼体系结构:现代计算机硬件体系结构1、输入设备:键盘2、输出设备:显示器3、存储器:内存条4、运算器:中央处理器CPU5、控制器硬件结构决定软件行为/ 所有设备都是围绕存储器工作的二、简单认识操作系统操作系统:内核+外部应用操作系统的功能:管理计算机软硬件资源操作系统的定位:一款“搞管...
2020-02-16 22:15:34 257
原创 C++总结(四)
一、多态1.多态的概念多态:同一个事物,在不同场景下表现出的不同的状态2.多态的分类静态多态(早绑定,静态联编): 在编译期间,根据所传递的实参类型或者实例化的类型,来确定到底应该调用那个函数即:在编译期间确定了函数的行为—函数重载、模板动态多态(晚绑定,动态联编):在程序运行时,确定具体应该调用那个函数3.动态多态的实现条件-- -在继承的体系中虚函数&重写:基类中必...
2020-02-14 18:12:11 505
原创 C++总结(三)
一、C++中动态内存管理:1、C/C++程序运行时:内存分布情况a、 栈又叫堆栈,非静态局部变量/函数参数/返回值等等,栈是向下增长的。b、内存映射段是高效的I/O映射方式,用于装载一个共享的动态内存库。用户可使用系统接口创建共享共 享内存,做进程间通信。(Linux课程如果没学到这块,现在只需要了解一下)c、. 堆用于程序运行时动态内存分配,堆是可以上增长的。d、数据段–存储全局数据...
2020-02-12 21:37:09 557
原创 C++总结(二)
一、this指针1、概念:类非静态成员函数的第一个隐藏的参数,该参数使用指向调用当前函数的对象2、特性:this指针类型:T* const普通类型成员函数:T* const 可以修改对象的内容,可以调用普通和const类型的成员函数const类型成员函数:const T* const:this指向不能修改并且指向对象中的内容也不能修改,只能调用const类型的成员函数this...
2020-02-11 20:05:13 190
原创 C++总结(一)
一、C++入门1、C++中关键字----C++98-----63个关键字2、命名空间什么是命名空间:一个作用域 一个部门----->一个公司命名空间的作用:防止命名冲突如何定义一个命名空间:namespace N1{变量、函数}命名空间中的成员如何使用a、N1::成员名字b、using N1::b;c、using namespace N1;二、缺省参数1、概念...
2020-02-10 19:09:57 1652 3
原创 Linux之常用工具
软件包管理工具:yum查看软件包:yum listyum list installedyum list | grep gdb安装软件包:yum install package_nameyum install lrzszyum install gcc gcc-c++yum install gdbyum install git移除软件包yum remove...
2019-12-03 09:55:42 184
原创 红黑树模拟实现STL中的map与set
红黑树的迭代器增加迭代器分为三步:定义一个类,封装一个指针1、构造2、就有指针的类似行为:operator*()、operator->()3、能够移动:前置++、后置++、前置–、后置–4、能够比较 :!=、==在容器类中给迭代器类型取别名在容器中增加begin()、end()#include<iostream>using namespace ...
2019-11-25 18:44:25 297 1
原创 Linux常见指令及权限理解
Linux下的基本指令命令的使用格式:命令名称[功能选项][操作对象]一、目录相关命令ls指令语法:ls [选项][目录或文件]功能:浏览目录内容常用选项:-a:查看隐藏文件,Linux以.开头的文件都是隐藏文件-l:查看文件详细信息pwd命令语法: pwd功能:查看当前详细信息Linux目录结构唯一,是一个树状结构,最底层是/根目录据对路径:起始路径是根目...
2019-11-19 09:44:03 217
原创 树形结构关联式容器的底层结构
四、底层结构树形结构的关联式容器map/set/multimap/multiset的共同点是:其底层结构都是按照二叉搜索树来实现的。一、什么是二叉搜索树?二叉搜索树的概念二叉搜索树又称二叉排序树,它或者是一颗空树,或者具有以下性质的二叉树:1)若它的左子树不为空,则左子树上所有节点的值都小于根节点的值2)若它的右子树不为空,则右子树上所有节点的值都大于根节点的值3)它的左右子树也...
2019-11-16 16:03:34 293
原创 树形结构的关联式容器
一、关联式容器关联式容器也是用来存储数据的,与序列式容器不同的是,其里面存储的是<key,value>结构的键值对,在数据检索时比序列式容器效率更高。二、键值对用来表示具有一一对应关系的一种结构,该结构中一般只包括两个成员变量key和value,key代表键值,value表示与key对应的信息。键值对的定义:template<class T1,class T2>...
2019-11-16 16:01:54 328
原创 智能指针的使用及原理
智能指针:管理资源,自动去释放资源RAIIRAII是一种利用对象生命周期来控制程序资源(如内存、文件局柄、网络连接,互斥量)的简单技术。在对象构造时获取资源,接着控制对资源的访问使之在对象的生命周期内始终保持有效,最后在对象析构的时候释放资源。我们实际是把管理一份资源的责任托管给了一个对象。这样做有两大好处:1)不需要显示的释放资源2)采用这种方式,对象所需的资源在其生命期内始终保持有...
2019-10-18 19:02:52 2117
原创 异常
一、C++异常的概念概念:首先既然有异常,那就肯定就正常。正常的含义是程序运行可以正确运行,并且能够得到预期的结果。那异常就是指程序无法进行,程序无法得到预期的结果。程序消亡的三种方式:1)程序正常结束----main---->return 02)自己将自己结束(自杀)例如:if(b==0) {exit(0);}3)被其他程序结束(被别人给杀死)例如:任务管理器...
2019-10-15 20:43:22 247
原创 C++继承
一、继承的概念及定义继承的概念继承机制是面向对象程序设计使代码可以复用的重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承是类设计层次的复用。 class Person{public: void print() { cout &l...
2019-10-05 17:04:23 127
原创 多态
一、多态的概念1、概念:通俗来说,就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会产生出不同的状态。举个列子:比如说买票这个行为,当普通人买票时,是全价票;学生买票时,是半价买票;军人买票时是优先买票。...
2019-10-03 14:07:48 144
原创 string类
一、标准库中的string类1、 string类(了解)字符串是表示字符序列的类标准的字符串类提供了对此类对象的支持,其接口类似于标准字符容器的接口,但添加了专门用于操作 单字节字符字符串的设计特性。string类是使用char(即作为它的字符类型,使用它的默认char_traits和分配器类型(关于模板的更多信 息,请参阅basic_string)。string类是basic_str...
2019-08-07 17:58:01 235
原创 链表和顺序表
一、线性表线性表(linear list)是n个具有相同特性的数据元素的有限序列。线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串…线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的,线性表在物理上存储时,通常以数组和链式结构的形式存储。线性表的存储结构特征:1、集合中必存在唯一的一个“第一元素”2、集合中...
2019-08-01 17:14:35 677
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人