自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 智能指针

内存泄漏的分类1、堆内存泄露堆内存指的是程序执行中依据须要分配通过malloc / calloc / realloc / new等从堆中分配的一块内存,用完后必须通过调用相应的 free或者delete 删掉。假设程序的设计错误导致这部分内存没有被释放,那么以后这部分空间将无法再被使用,就会产生堆内存泄漏2、系统资源泄露指程序使用的系统分配资源,如套接字,文件描述符,管道等没有使用对应的函数释放掉,导致系统资源的了浪费,严重可导致系统性能减少,系统执行不稳定智能指针的使用及原理RALL是一种利用

2020-09-19 19:16:24 143

原创 关联式容器 键值对 set set的构造 map的介绍 map的构造元素的修改 multiset的构造

1.关联式容器关联式容器也是用来存储数据的,与序列式容器不同的是,其里面存储的是<key, value>结构的键值对,在数据检索时比序列式容器效率更高。键值对用来表示具有一一对应关系的一种结构,该结构中一般只包含两个成员变量key和value,key代表键值, value表示与key对应的信息...

2020-09-18 14:53:33 208

原创 继承 多态《基类和派生类的赋值转换》《继承中的作用域》《派生类的默认成员函数》《继承与友元》《菱形继承与菱形虚继承》

继承定义:1.定义格式class student::public person{ public: int _stuid; //学号 int _major; //专业 }2.继承基类成员访问方式的变化在实际运用中一般使用都是public继承,几乎很少使用protetced/private继承,也不提倡使用protetced/private继承3.基类和派生类对象的赋值转换派生类对象 可以赋值给 基类的对象 / 基类的指针 / 基类的引用。这里有个

2020-09-14 18:05:54 140

原创 stack和queue

1.stsck 的介绍和使用一种容器适配器,专门用在有后进先出操作的上下文环境中,其删除只能从容器的一端进行元素的插入与提取操作2.stack的使用stack() 构造空的栈empty() 检测stack是否为空size() 返回stack重元素的个数top() 返回栈顶元素的引用push() 将val压入stack中pop() 将stack中尾部的元素弹出用两个栈实现队列template<typ

2020-09-13 10:17:38 101

原创 《list的介绍使用》《list的构造》《list iterator使用 》《list capacity》《list迭代器失效问题》

1.list的介绍使用list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后一个素。与其他的序列式容器相比(array,vector,deque),list通常在任意位置进行插入、移除元素的执行效率更好。list的构造list () 构造空的listlist (size_type,const value_type&a

2020-09-12 14:18:36 73

原创 vector的介绍和使用:《vector》的空间增长问题 增删改查 vector的遍历 vector的迭代器失效问题

1.vector的使用1.1vector的定义void printvector(const vector<int>& v){ vector<int>::const_iterator it = v.begin(); while (it != v.end()) { cout << *it << ""; ++it; } cout << endl;}int main(){ //尾插4个数据 vector<

2020-09-12 14:18:06 163

原创 泛型编程 函数模板 STL 深拷贝 string类的传统和现代写法

1.泛型编程泛型编程:编写与类型无关的通用代码,是代码复用的一种手段。模板是泛型编程的基础。2.函数模板2.1函数模板概念:函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型产生函数的特定类型版本。2.2函数模板格式:template<typename T1,typename T2,…>...

2020-09-01 09:13:00 148

原创 C++复习:引用和指针的区别 inline内联函数 函数重载 this指针 explicit static

1.c++引用与c指针的区别语法概念层面:引用变量只是别名,没有实际空间,与其实体共用同一块内存(有区别)底层实现上:引用就是指针,引用实际上是有空间-----------地址(无区别)1.引用在定义时必须初始化,指针没有要求。2.引用在初始化时引用一个实体后,就不能再引用其他实体,而指针可以在任何时候指向任何一个同类型实体。3.在sizeof中含义不同:引用结果为引用类型的大小,但指针始终是地址空间所占字节个数(32位平台下占4个字节)4.有多级指针,但是没有多级引用。2. inline内联

2020-08-31 08:27:14 189 1

原创 c++this指针 友元类 虚函数 static new和delete 定位new表达式

1,this指针this指针是成员函数第一个隐含的指针形参,一般情况下由编译器通过exc寄存器自动传递,不需要用户传递寄存器:eax ebx ecx edx ebp esp…空间小 速度快 离cpu近的存储空间一般情况下内存中的数据要进行计算,基本上都是先将数据放到寄存器中,然后再来进行运算this指针的类型: *const只有在类的非静态成员函数中才可以使用this指针,其他任何函数都不可以this指针的特点:1.全局函数静态函数都不能使用this指针,实际上成员函数默认第一个参数是

2020-08-30 14:19:10 206

原创 八大排序算法:《直接插入排序》《希尔排序》《选择排序》《冒泡排序》《快速排序》《归并排序》

插入排序:直接插入排序 希尔排序选择排序:选择排序 堆排序交换排序:冒泡排序 快速排序归并排序1.直接插入排序特点:元素集合越接近有序,直接插入排序算法的时间效率越高时间复杂度:O(N^2)空间复杂度:O(1),它是一种稳定的排序算法稳定性:稳定void InsertionSort(int *arr, int size){ int i, j, tmp; for (i = 1; i < size; i++) { if (arr[i] < a

2020-08-28 08:12:49 123

原创 《时间复杂度》《空间复杂度》《顺序表模拟实现》

时间复杂度算法中基本操作的执行次数,为算法的时间复杂度基本操作,即只有常数项,认为其时间复杂度为O(1)顺序结构,时间复杂度按加法进行计算循环结构,时间复杂度按乘法进行计算分支结构,时间复杂度取最大值判断一个算法的效率时,往往只需要关注操作数量的最高次项,其它次要项和常数项可以忽略在没有特殊说明时,我们所分析的算法的时间复杂度都是指最坏时间复杂度空间复杂度空间复杂度算的是变量的个数。空间复杂度计算规则基本跟实践复杂度类似,也使用大O渐进表示法。顺序表顺序表是用一段物理地址连续的存储单

2020-08-24 15:59:30 159

原创 C语言:《动态内存函数》《malloc》《calloc》《relloc》《动态内存常见错误》

1.动态内存函数malloc向内存申请一块连续的可用空间,并返回指向这块空间的指针malloc实现内存分配,当程序调用malloc时,malloc会从内存中取出一块合适且地址连续的内存(没有初始化),并把内存的首地址返回。但是malloc不知道我们申请的类型,所以特的返回值必须是void,可以转换成任意类型的指针。我们接受返回值时必须要进行强制类型转换。如果内存不足,则会返回一个空指针(NULL)。所以malloc开辟的空间在使用时我们必须检查返回值是否为空。其中size为所申请的个数。*void

2020-08-24 10:26:54 176

原创 C语言:字符函数和字符串函数 strlen strcpy strcat strcmp strstr memcmp memove memcmp

求字符串的长度:strlensize_t strlen(const char *str);字符串已经 ‘\0’ 作为结束标志,strlen函数返回的是在字符串中 ‘\0’ 前面出现的字符个数(不包含 ‘\0’ )。参数指向的字符串必须要以 ‘\0’ 结束。注意函数的返回值为size_t,是无符号的#include <stdio.h>int My_strlen(const char *ch) //加const是为了不要让其他的条件改变ch的值{ int count

2020-08-23 17:19:10 276

原创 C语言:《数据的存储》 《指针进阶》《回调函数》《指针的面试题》

数据的存储1.数据类型的基本归类1.整形:char :unsigned char signed charshortunsigned short[int] signed short[int]intunsigned int signed intlongunsigned long[int] signed long[int]2.浮点数:float double3.构

2020-08-23 09:43:29 142

原创 C语言:《一维数组 二维数组的初始化和使用》, 《操作符详解》 ,《结构体初始化 传参 》《 结构体内存对齐》

一.1.一维数组的创建和初始化int arr1[10]; int count = 10; int arr2[count];// 不能创建数组 char arr3[10];数组创建, [] 中要给一个常量才可以,不能使用变量。char arr4[]="abc";char arr5[3]={'a','b','c'};双引号里面的是字符串,代表的却是一个指向无名数组起始字符的指针,该数组被双引号之间的字符以及一个额外的二进制值为零的字符‘\0’初始化;而单引号里面的代表字符,字符使用

2020-08-20 11:04:50 283

原创 C语言:变量 常量 数据类型 数组 操作符 关键字 指针 结构体 语句.....基本概念

1.数据类型windows64位下:char //字符数据类型 (1字节)short //短整型 (1字节)int //整形 (4字节)long //长整型 (4字节)long long //更长的整形 (8字节)float //单精度浮点数 (4字节)double

2020-08-18 11:19:07 204

原创 栈的实现

#include"stack.h"#include<malloc.h>#include<assert.h>#include<stdio.h>#include<string.h>void stackInit(stack* ps){ assert(ps); ps->array = (SDataType*)malloc(sizeof(SDataType)* 10); if (NULL == ps->array) { assert

2020-08-16 21:03:10 74

原创 链表的实现

#include"list.h"#include<malloc.h>#include<assert.h>#include<stdio.h>SListNode* BuySListNode(SLDataType data){ SListNode* newNode = (SListNode*)malloc(sizeof(SListNode)); if (NULL ==newNode) { assert(0);//调试宏,参数为0触发,非0不会触发 re

2020-08-16 10:45:18 84

原创 带头节点的双向循环链表的实现

#pragma once#include <stdio.h>#include <stdlib.h>#include <assert.h>#include <malloc.h>typedef int DataType;typedef struct ListNode{ DataType data; struct ListNode* next; struct ListNode* prev;} ListNode;ListNode *ListIn

2020-08-15 19:46:12 124

原创 每日一题:链表oj题

1.找链表倒数第k个节点class Solution {public: ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) { if(NULL==pListHead||k==0) return NULL; ListNode* fast=pListHead; ListNode* slow=pListHead; while(k--) { if(NULL==fast)

2020-08-14 11:32:56 96

原创 链表oj题

删除链表中等于给定值 val 的所有节点。struct ListNode* removeElements(struct ListNode* head, int val){ struct ListNode*cur=head; struct ListNode*prev=NULL; while(cur) { if(cur->val==val) { if(cur==head) { head=cur->n.

2020-08-13 18:48:42 206

原创 每日一题:数据结构oj题

1.给定一个数组,将数组的元素向右移动k个位置, 其中k 是非负整数#include<windows.h>#include<stdio.h>#pragma warning (disable:4996)int main(){ int k; printf("please input the value of k : \n"); scanf("%d", &k); //输入k int ar[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9,

2020-08-13 11:43:22 363

原创 有关数组首元素地址和数组本身

数组在两种情况下代表数组本身------即该段连续空间1.对数组名进行取地址2.数组名出现在sizeof之后其余数组名表示首元素地址比如:函数传参----int*int *p1=array;int *p2=array+0;int *p3=&array[0]; 等价char p3=NULL; // 0 (void)0 数值上相等 含义不同整形数字0 0号地址元素 int main() { int ar

2020-08-13 08:25:33 260

原创 linux:网络编程 《网络基础1》《协议分层》《UDP通信》

1.网络基础:网络的发展以及一些网络编程的知识点:局域网:网络覆盖范围1000米以内的网络城域网:网络覆盖一个城市的范围广域网:网络覆盖范围通常在20千米以上互联网,公网,因特网----国际化的超大型广域网组网方式:以太网ip地址是无符号四个字节的整数,那么IP地址总共也就43亿个。全世界够分吗?IP地址版本的区分:ipv4:无符号四个字节的整数,不够用,解决方案:DHCP技术—动态地址分配技术;NAT技术—网络地址转换技术ipv6:无符号六个字节的数据,但是目前ipv6,推广难度高,到

2020-08-08 09:51:04 112

原创 linux:《线程概念》《线程控制》《线程安全》《线程应用》

1.线程概念:线程:线程是进程中的一条执行流进程是一个运行中的程序,要完成一个/多个任务,在以前进程中,多个任务只能串行完成,因为以前的进程中是只有一条执行流的进程若一个进程中有多条执行流,则多个任务可以同时并行处理(CPU资源足够),提高任务处理效率一个生产工厂,进程就像工厂/线程就像工厂中干活的工人linux如何实现一个进程中有多个执行流,执行流又是什么?在linux中,pcb是一 个程序动态运行的描述, 一个pcb就可以调度一段代码的执行, 因此在linux中执行流就是pcb反过来说,l

2020-07-31 16:55:20 146

原创 linux :《进程间通信》《进程间通信介绍》《管道》《消息队列》《共享内存》《信号量》

1.进程间通信操作系统提供的进程间通信方式,因为进程间具有独立性,无法直接通信,因此操作系统根据应用场景不同提供了不同的进程间通信方式。其中包含:管道 ,共享内存 ,消息对列 ,信号量1.1 管道:就是内核中的一块缓冲区,多个进程通过访问同一个管道实现数据传输。分类:匿名管道 / 命名管道匿名管道:只能用于具有亲缘关系的进程间通信内核中管道缓冲区没有标识符,其他进程无法获取,只能通过子进程复制父进程的方式获取到同一管道的操作句柄进行通信int pipe(int pi

2020-07-28 15:39:10 84

原创 Linux:基础IO 《标准库的IO接口》《系统调用IO接口》《重定向原理》《文件系统》

1.标准库的IO接口标准库io接口:fopen / fwrite/ fread/ fseek/ fclose/ printf/ fprintf/ gets/ fgets/ scanfFILEfopen (const char path ,const char *mode);—打开一个文件int execl(const char *path, const char *arg, .). exec(“Is”, “Is”, *1", “-a”, NULL)_int execlg(const char

2020-07-23 09:45:34 119

原创 《进程创建》《进程终止》《进程等待》《进程程序替换》

1.进程创建fork函数初始在linux中fork函数时非常重要的函数,它从以存在的进程中创建一个新进程。新进程为子进程,而原进程为父进程。#include<unistd.h>

2020-07-21 09:38:01 66

原创 c++《AVL树的概念》《AVL树的插入》《AVL树的旋转》《AVL树的验证》《AVL树的删除》《AVL树的性能》

4.1 AVL树4.1.1 AVL树的概念二叉搜索树虽可以缩短查找的效率,**但如果数据有序或接近有序二叉搜索树将退化为单支树,查找元素相当 于在顺序表中搜索元素,效率低下。**因此,两位俄罗斯的数学家G.M.Adelson-Velskii和E.M.Landis在1962年 发明了一种解决上述问题的方法:当向二叉搜索树中插入新结点后,如果能保证每个结点的左右子树高度之 差的绝对值不超过1(需要对树中的结点进行调整),即可降低树的高度,从而减少平均搜索长度。它的左右子树都是AVL树它左右树高度之差(

2020-07-20 10:26:04 98

原创 《map和set》《关联式容器》《键值对》《树形结构的关联式容器》《底层结构》

1.关联式容器在初阶阶段,我们已经接触过STL中的部分容器,比如:vector、list、deque、forward_list(C++11)等,这 些容器统称为序列式容器,因为其底层为线性序列的数据结构,里面存储的是元素本身。那什么是关联式容 器?它与序列式容器有什么区别?关联式容器也是用来存储数据的,与序列式容器不同的是,其里面存储的是<key, value>结构的键值对,在 数据检索时比序列式容器效率更高。2.键值对**用来表示具有一一对应关系的一种结构,该结构中一般只包含两个成员变

2020-07-20 09:40:20 123

原创 《二叉树进阶》《二叉搜索树》《二叉搜索树的代码实现》

1.二叉搜索树1.1二叉搜索树概念:二叉搜索树又称二插排序树,它或者是一颗空树,或者是具有以下性质的二叉树:<1: 若它的左子树不为空,则左子树上所有节点的值都小于根节点的值<2: 若它的右子树不为空,则右子树上所有节点的值都大于根节点的值❤️: 它的左右子树也分别为二叉搜索树1.2二叉搜索树的操作1二叉搜索树的查找2.二叉搜索树的插入插入的具体过程如下:3.二叉搜索树的删除:首先查找元素是否在二叉搜索树中,如果不存在则返回,否则要删除的节点可能分下面四种情况:a

2020-07-13 15:58:27 75

原创 《多态的概念》《多态的定义及实现》《抽象类》《多态的原理》《单继承和多继承关系中的虚函数表》

1.多态的概念:1.1概念:多态的概念:通俗来说,就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会产生不同的状态举个栗子:比如买票这个行为,当普通人买票时,是全价买票;学生买票时,是半价买票;军人买票时是优 先买票。2.多态的定义及实现2.1多态的构成条件多态是在不同继承关系的类对象,去调用同一函数,产生了不同的行为。比如Student继承了Person。 Person对象买票全价,Student对象买票半价。那么在继承中要构成多态还有两个条件:必须通过基类的指针或者引用调用

2020-07-11 20:15:34 204

原创 c++的继承 《继承的概念及定义》《基类和派生类对象的赋值》《继承中的作用域》《派生类的默认成员函数》《继承与 友元》《基类与静态成员》

继承的概念及定义1.1 继承的概念:继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特 性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构, 体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承是类设计层次的复用。...

2020-07-10 09:41:08 184

原创 list的模拟实现

namespace bite{ template<class T> struct Listnode { Listnode<T>*next; Listnode<T>*prev; T val; Listnode(const T&value) :next(nullptr) : prev(nullptr) , val(value) {} }; template<class T> class list {

2020-06-24 15:41:10 72

原创 list :《list的介绍和使用》《list的深度剖析和模拟实现》《list与vector的对比》

一.list的介绍和使用1.list是可以在常数范围内在任意位置进行插入与删除的序列式容器,而且该容器可以前后双向迭代。2.list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后一个元素。3.list与forward_list 非常形似:最主要的不同在于forward是单链表,只能朝前迭代,已让其更简单高效。4.与其他的序列式容器相比(array,vector,deque),list 通常在任意位置进行插入,移除元素的执行效率更好。5.与其

2020-06-24 10:31:37 82

原创 C++ vector《vector增删查找接口实现》《迭代器失效的问题》《常见的迭代器失效的场景》

一.vector的增删查改1.下面我们看下push_back/pop_back 的代码实现#include<iostream>#include <vector>using namespace std;int main(){ int a[] = { 1, 2, 3, 4 }; vector<int>v(a, a + sizeof(a)/sizeof(a[0])); vector<int>::iterator it = v.begin()

2020-06-23 16:07:31 123

原创 C++ vector《vector的介绍》《vector iterator的使用》《vector中 (capacity) (reserve) (resize)实现和三者的区别 》

一.vector的介绍和使用1.1vector的介绍:vector是表示可变大小数组的序列容器。就像数组一样,**vector也采用的连续存储空间来存储元素。**也就是意味着可以采用下标对vector的元素 进行访问,和数组一样高效。但是又不像数组,它的大小是可以动态改变的,而且它的大小会被容器自 动处理。本质讲,**vector使用动态分配数组来存储它的元素。当新元素插入时候,这个数组需要被重新分配大小 为了增加存储空间。**其做法是,分配一个新的数组,然后将全部元素移到这个数组。就时间而言,这

2020-06-20 18:43:45 186

原创 c++内存管理 《C++内存分布》《C语言中动态内存管理》《new 与delete的实现原理》《定位new表达式》

一.C++内存分布:说明:1.栈又叫堆栈,费静态局部变量/函数参数/返回值等等,栈是向下生长的。2.内存映射段是高效的I/O映射方式,用于装载一个共享的动态内存库,用户可使用系统接口创建共享内存,做进程间通信3.堆用于程序运行时动态内存分配,堆是向上增长的。4.数据段—存储全局数据和静态数据。5.代码段—可执行的代码/只读常量。二.C语言中动态内存管理方式1.malloc/calloc/realloc和free都是用来进行动态内存申请的库函数,申请的空间在堆上,用完后使用free释放,返

2020-05-31 19:50:30 135

原创 《进程》《进程描述》《进程状态》《环境变量》《程序地址空间》

进程1.冯诺依曼体系结构: 现代计算机的硬件体系结构。五大硬件单元:输入设备/ 输出设备/ 存储器/ 运算器/ 控制器输入设备:键盘输出设备:显示器存储器:内存 8G运算器+控制器: CPU—主频2.5GHz时钟振荡周期—机器指令周期–决定了一秒钟之内能处理多少条指令内存条的存储介质和硬盘存储介质是不同的内存条的存储介质:易失性----断电后数据就会消失硬盘:实现断电数据依然存在----作为数据的持久化存储设备内存是用作各个设备之间数据缓冲作用的,因此所有设备都是围

2020-05-29 22:34:20 112

原创 linux《yum》《vim》《gcc/g++》《gdb》《Make/makefile》学习

1.yum:软件包管理工具通过yum list命令可以罗列出当前一共有哪些软件包,由于包的数目众多,这里我们需要使用grep命令只筛选出我们关注的包,例如:

2020-05-27 09:46:59 256 1

空空如也

空空如也

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

TA关注的人

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