自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 【快排、UDP/TCP协议、TCP/IP分层模型及每层特点、死锁产生及避免方法】

快速排序属于交换排序的一种,是基于二叉树结构的交换排序的方法;基本思想:1)任取待排序元素序列中的某元素作为基准值,按照该排序码将待排序集合分割成两个子序列;2)左子序列中所有元素均小于基准值,右子元素序列中所有元素均大于基准值,然后左右子序列重复该过程,直到所有排列都在相应的位置上;代码:oid quickSort(int *array, int left, int right){ if(left < right) { int pivot = array[left];.

2020-09-18 18:02:34 85

原创 【字符串筛选--小米】

题目描述:对输入的字符串,去掉重复的字符,只保留第一次出现的字符;解题思路:整两个容器,遍历第一个容器,并判断其元素是否在第二个容器里,在的话,不作为,不在的话添加进去即可;代码:#include<iostream>#include<string>#include<vector>using namespace std;void screen(vector<char>&old, vector<char>&n

2020-09-16 09:51:12 24

转载 【反转链表 c++实现】

【题目描述】输入链表的头结点,反转链表后输出链表的所有元素;struct ListNode { int val; struct ListNode *next;};【解题思路】1)定义三个辅助指针和一个用于表示翻转链表头结点的指针;2)node指向当前节点、left指向当前节点的前一个节点、right指向当前节点的下一个节点、ReverseHead指向翻转链表的头结点;【】题目来源:牛客网参考博客:https://www.cnblogs.com/wanglei5205/

2020-09-11 19:49:38 27

原创 【数据结构(栈和队列)】

一、栈1、什么是栈?栈是一种特殊的线性表 ,只允许在固定的一端进行元素的插入和删除操作,且称进行操作的那一段为栈顶,另一端称为栈底;2、栈的基本操作(1)压栈栈的插入操作,插入的数据在栈顶(2)出栈栈的删除操作,出栈的数据也是栈顶数据即先进先出;3、栈的实现栈一般利用数组或者链表实现,常用数组结构实现,因为尾插时的代价比小;stack.h// 顺序表的动态存储#ifndef _Stack_H_#define _Stack_H_#include <stdio.

2020-09-09 20:30:55 18

原创 【c++11特性小总结】

一、C++11相比于C++98/03的变化?相比于C++98/03,C++11包含了约140个新特性,能更好的用于系统开发和库开发,语法更加简单化、稳定、安全,且能提高程序员开发效率;二、列表初始化C++11允许使用{}对数组元素进行统一的列表初始值设定,但是对于自定义类型,没有办法使用这样的初始化;(1)内置类型列表初始化直接用{}对变量、数组、标准容器进行初始化;且在{}之前使用等号,其效果和不适用=没有区别;(2)自定义类型列表初始化- 支持单个对象的列表初始化(引用、cons

2020-09-09 17:51:07 14

原创 【数据结构(时间、空间复杂度;顺序表;链表【链表有环、环入口点、链表相交、有序链表合并】)】

一、时间复杂度和空间复杂度1、什么是算法效率?算法效率分为时间效率和空间效率,时间效率被称为时间复杂度而空间效率称为空间复杂度;时间复杂度是主要衡量一个算法的运行速度,而空间复杂度主要衡量的是算法所需要的额外空间;2、什么是时间复杂度?时间复杂度是主要衡量一个算法的运行速度,因不能每次都让算法上机测试计算时间复杂度,所以将算法中的基本操作的执行次数,作为算法的时间复杂度;如何计算时间复杂度?答:大概计算算法的执行次数,用大O的渐进表示法进行表示;确定大O阶方法:(1)用常数1取

2020-09-09 17:49:27 98

原创 【了解空间配置器、STL关联式容器总结】

一、空间配置器1、什么是空间配置器?空间配置器是为了各个容器高效管理空间(实行空间申请与回收)而设置的内存管理机制;2、为什么需要空间配置器?在模拟实现很多容器的时候发现很多空间都是通过new动态申请的,故:a)动态申请的空间需要用户自己进行释放容易造成内存泄漏;b)频繁申请小块内存容易造成内存碎片,影响程序运行效率;c)malloc和new申请的空间,每块存在额外空间浪费,且申请空间失败没有应对方法;d)未考虑线程安全问题;3、STL空间配置器的实现原理以128作为小块内存

2020-09-07 20:33:11 22

原创 【STL中set怎样可以在插入时自动从大到小排序?】

map和set都是按照从小到大的顺序进行排序的,且排序好后不能轻易更改,否则会破坏组织结构;如何让其在插入过程中可以自动的变成由大到小的排序方式呢?tips:set在进行插入的时候一般会按照**<来比较关键字,所以其插入好的状态一般是从小到大;但是对于自定义类型,就需要重载<来支持这一操作;1、使用set前指定比较方式为greater**void test(){ set<int,greater<int>>S2; S2.insert(10.

2020-09-07 20:32:23 165

原创 【哈希结构、哈希应用、unorder系列关联式容器】

一、以哈希为底层结构的unordered系列关联式容器(因为以红黑树为底层结构的,在树中结点非常多的情况下,其查询效率也不是非常的理想,所以c++11中又提供了底层结构为哈希结构的查询效率较高的容器)1、unordered_map(1)特点:存储键值对键和值的映射类型可能不同通过key访问value的速度比map要快,但是迭代效率比较低实现了中括号[]的重载至少有向前的迭代器(2)unordermap和map的对比:map:优点:有序性,这是map结构最大的优点,其元素的有序性在

2020-09-06 18:00:50 34

原创 【红黑树】

一、什么是红黑树?红黑树是一种二叉搜索树,但是每个结点上都增加一个颜色,可以是红色或者黑色;通过对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路径会比其他路径长出两倍(相对于二叉搜索树条件弱化了),因而接近平衡;二、红黑树的性质(1)每个结点不是红色就是黑色;(2)根节点是黑色的;(3)若一个结点是红的那么它的两个孩子结点都是黑色的;(4)每个结点,从该结点到其他所有后代叶节点的路上,所包含的黑色结点数目是相同的;(5)每个叶子节点都是黑的;三、红黑树的定义

2020-09-05 17:04:06 53

原创 【关联式容器、键值对、map、set、二叉搜索树、AVL树】

一、关联式容器1、什么是关联式容器?关联式容器也是用来存储数据的,与序列式容器(vector、list【底层是线性序列的数据结构】)不同的是,其存储的是<key,value>类型的键值对,数据检索时比序列式容器更加高效;2、什么时键值对?用来表示具有一一对应关系的一种结构,该结构中一般只包含两个成员变量key和value,key代表键值,value代表与key对应的信息;STL一共实现了两种不同结构的管理式容器:树形结构和哈希结构;二、树形结构关联式容器以下四种容器的共同特点是

2020-08-27 20:42:41 61

原创 【c++类型转换(c语言强制类型转换、c++强制类型转换、)】

一、c语言强制类型转换1、小范围类型转大范围类型的隐式类型转换2、大范围类型转小范围类型的显式类型转换缺陷:转换可视性比较差;二、c++强制类型转换四种强制类型转换的操作符:1、static_cast用于非多态(静态)类型的转换,比如数字类型之间的转换,但不可用于两个毫无关系的类型相互转换;2、reinterpret_cast用于将一种类型转换为另一种类型,比如:将指针转化为一个值放在一个变量里;3、const_cast添加或者删除变量的const属性;4、dynamic_ca

2020-08-26 19:00:57 27

原创 【c++智能指针及RAII机制的理解】

一、为什么要有智能指针?因为在平时编程过程中,极大可能会出现两种情况;(1)malloc出来的空间,没有进行释放,存在内存泄漏;(2)如果在malloc和free之间抛异常,那么同样存在内存泄漏问题。该问题称为异常安全问题。二、智能指针原理及使用1、智能指针的实现是基于RAII(资源获取即初始化)。即对象在构造时获取资源,且在对象的声明周期内资源始终有效,最后在对象析构的时候释放资源。即将一份资源管理的责任交给了一个对象。2、使用RAII思想设计智能指针类...

2020-08-26 17:27:21 61

原创 【c++ 异常】

一、c语言处理异常方式1、终止程序(如assert断言)2、返回错误代码(errno中存放的错误代码被返回)二、c++异常1、c++异常的概念 当一个函数发现自己无法处理的错误时就可以抛出异常,让函数的直接或者间接调用者去处理这个错误。2、关于异常的一些关键字 (1)throw:通过throw关键字来抛出异常(2)catch:在想要处理问题的地方,通过异常关键字catch来捕获这个异常(可有多个catch)(3)try:try块中为防止可能抛出异常的代码,其后常常紧跟一个或多个catch

2020-08-26 09:36:12 36

原创 【c++多态(虚函数、抽象类、虚表、静/动态绑定)】

一、什么是多态?1、多态基本概念多态就是去完成某个行为,不同的对象会产生出不同的状态。例子:普通人去服装店买衣服是按标准价给钱的,而店内员工在该店买东西,是按照员工价付款的。2、多态的定义(1)在继承中构成多态的两个条件:-必须通过基类指针或引用调用虚函数-被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写。class Ordinary{ public: virtue void BuyCloth() { cout<<"全价购买" }};cla

2020-08-25 16:33:03 47

原创 【动态内存管理、文件操作、程序环境和预处理】

一、动态内存管理1、为什么存在动态内存管理?因为常规的内存分配只能分配固定大小的空间,比如数组和变量的定义,只会分配固定大小的空间。而有时候需要的空间在运行时才能确定。2、常见动态内存函数(1)malloc和freemalloc: void* malloc(size_t size);成功返回指向开辟好空间的指针,否则返回NULL指针。(返回的指针需要进行强转为所需类型)free: void free(void* ptr);释放动态内存(2)callocvoid * calloc(si

2020-08-25 16:01:55 22

原创 【整型和浮点型在内存中的存储、大小端、指针传参、strlen和sizeof区别、结构体对齐】

一、数据存储整型和浮点型在内存中是如何存储的?(1)整形整形在内存中是以补码的形式存储的,因为以补码形式存储保证了0的唯一性、使加减运算可以统一处理(因为cpu只有加法器,补码形式存储可以将减法用加法代替,提高运算效率)(2)浮点型浮点型在内存中的存储遵循IEEE-754格式标准,由符号位、指数和有效数字三个部分组成。对于32位的浮点数最高位为符号位、接着8位指数位、剩下的是32位有效数字;而对于64位的浮点数,同样最高位是符号位,接着是11位指数位,最后是52位有效数字位。不过对于

2020-08-25 11:18:39 49

原创 【继承练习(实现不被继承的类等)】

1、实现一个不能被继承的类将构造函数私有化或者利用c++11新关键字fininal禁止继承class NonInherit{public://这样派生类没有办法调用基类的构造函数,因此无法继承static NonInherit GetInstance(){return NonInherit();}private:NonInherit()//构造函数私有{}};// C++11给出了新的关键字final禁止继承class NonInherit final{};2、继承和

2020-08-16 16:27:39 17

原创 【c++继承、菱形继承、基类派生类对象转换、虚继承等】

一、继承的概念和定义1、继承的概念继承是实现代码可复用性的重要方法,在保留原类的特征基础上做一些扩展,形成新的类,叫做派生类。一个例子:父亲有一套房子,儿子长大了,父子两人共同拥有这套房。但是经过儿子的奋斗,自己又买了一套房,此时儿子可以说是拥有两套房,一套与父亲共享,一套完全属于自己。就像派生类一样,既有父类的东西,又有自己的东西。2、继承的定义(1)定义格式class Student : public Person{ public: int _stuid;

2020-08-16 14:08:17 49

原创 【c++的IO流、文件流对象】

1、c语言的输入输出c语言常用scanf():从标准输入读取数据,并将其存放至变量、printf():将指定文字/字符串输出到标准输出设备,设定输出宽度和精度;输入输出缓冲区:(1)屏蔽低级IO实现(2)可实现行读取2、c++的IO流(1)流,是是对一种有序连续且具有方向性的数据( 其单位可以bit,byte,packet )的抽象描述。为了实现这种流,c++定义了I/O标准库。(2)c++实现的庞大类库是以ios为基类,其他类是直接或间接派生自ios类的。(3)cerr、clo

2020-08-15 17:43:15 97

原创 【priority_queue、stack、queue模拟实现】

1、priority_queue模拟实现(1)priority_queue.h#pragma once#include<vector>namespace pz{ template<class T,class Container = vector<T>,class Compare = less<T>> class priority_queue { public: void AdjustUp(int child)//向上调整,大堆

2020-08-15 10:43:04 26

原创 【Stl配接器-stack和queue】

一、stack的介绍1、什么是stack(栈)?(1)stack是一种容器适配器,用在先进后出情境下,只能在容器的一端进行插入和删除操作。(2)二、queue的介绍三、priority_queue的介绍四、容器适配器...

2020-08-14 19:43:39 27

原创 【Stl-deque】

1、deque简介:(1)deque是双端队列,双端队列是动态大小的序列式容器,可以向两端进行伸缩。(2)deque通常是一种动态数组,允许随机访问。(3)deque在头尾进行插入和删除操作与vector类似,效率较高,但deque并不保证所有元素存储在连续空间中,以指针加偏移进行访问有可能会非法。(4)deque的内部实现比vector更加复杂,同时也使deque在某些特定情况下增长更加高效,尤其是序列比较大,重新分配成本比较高的情况下。2、deque基本使用(1)构造(1)无参构造

2020-08-12 08:11:00 30

原创 【list的模拟实现】

1、list的迭代器底层实现用一个类型去封装结点的指针,构成一个自定义类型,然后重载*和++等运算符,使其可以像指针一样进行使用。2、模拟实现list刚开始实现的初步工作就是实现一个双向循环链表,并且指向自己。...

2020-08-10 21:26:02 25

原创 【STL-list】

一、list简介1、为什么会有list?作为补充vector缺点而存在。vector是顺序表,list是链表。list和vector的区别实际上就是顺序表和链表的区别。vectro缺点:(1)头部和中部的插入删除效率低,o(N),需要挪动数据。(2)插入数据空间不够需要增容,增容需要开新空间、拷贝数据再释放旧空间,会付出很大的代价。vector的优点:(1)支持下标随机访问,间接支持排序、二分查找,堆算法等等。2、list优缺点:优点:(1)list头部、中间插入不再需要挪动数据,

2020-08-08 17:07:27 42

原创 【vector的模拟实现】

1、构造函数//无参构造vector() :_start(nullptr), _finish(nullptr), _endofstorage(nullptr) {}//拷贝构造1 vector(const vector<T>&v) { _start = new T[v.capacity()]; _finish = _start + v.size(); _endofstorage = _start + v.capacity();

2020-08-06 10:11:40 32

原创 【STL-vector】

一、vector简介1、 vector是表示可变大小数组的序列容器2、vector和数组一样采用连续空间存储数据,可用下标对其进行访问,效率很高。不同的是其大小可以动态改变是由容器自动处理的。3、vector插入一个数据,需要重新分配一个数组,并将所有元素移到这个数组。4、与其他容器相比,vector访问元素、末尾添加和删除元素效率更高效,不在末尾的添加和删除元素操作效率更低。二、vector的常用接口1、构造函数(1)vector():无参构造(2)vector(size_type

2020-08-06 09:44:24 23

原创 【字符串相加、相乘等】

1、反转字符串编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。你可以假设数组中的所有字符都是 ASCII 码表中的可打印字符。class Solution {public: void reverseString(vector<char>& s) { int i = 0 , j = s.size()-

2020-08-03 16:45:54 72

原创 【STL-string】

一、STL简介1、什么是STL?STL是是C++标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包括数据结构与算法的软件框架。2、STL的六大组件仿函数、算法、迭代器、空间配置器、容器、配接器。3、STL的缺陷(1)STL库更新太慢(2)STL没有支持线程安全,并发环境下需要自己加锁(3)追求效率导致内部结构复杂(类型萃取等)(4)STL会导致代码膨胀(本质是模板语法导致的)二、String类1、string类简介(1)string类是表示字符串序列的类(2)其接口

2020-08-03 15:18:33 37

原创 【string的模拟实现】

1、简单string类实现(深拷贝)namespace pz{ class string { public: //构造函数,无参和带参的 string() :_str(nullptr) {} string(char* str) :_str(new char[strlen(str) + 1])//在堆上多申请一个空间存\0 { strcpy(_str, str);//再将数据拷贝到代码段 } string(const string&s)//深拷

2020-08-03 11:05:46 34

原创 【strcpy函数】

strcpy函数的使用strcpy()函数是C语言中的一个复制字符串的库函数。char * strcpy(char *dst,const char *src) { if((dst==NULL)||(src==NULL))return NULL;char *ret = dst; //[1]while ((*dst++=*src++)!='\0'); //[2]return ret;//[3] }一、const 修饰:源字符串参数用const修饰,防止修改源字符串;二、

2020-07-31 19:48:56 36

原创 【模板】

1、泛型编程编写与类型无关的通用代码,是代码复用的一种手段。模板是泛型编程的基础2、模板分为函数模板和类模板(1)函数模板什么是函数模板?解:代表了一个函数族,该模板与类型无关,在使用时被参数化,根据**实参类型产生函数的特定类型版本。template<typename T>void Swap( T& left, T& right){T temp = left;left = right;right = temp;}注:template是定

2020-07-26 14:37:44 30

原创 【了解单例模式】

1、设计一个类,只能在堆上创建对象方法:构造函数私有化将构造函数私有化,拷贝构造也要私有化(若对堆上创建的对象进行解引用并调用拷贝构造,同样可以在栈上创建对像。)提供一个静态函数,静态函数完成堆上对象的创建。class Test{ Test() { cout << "Test()" << endl; } ~Test() { cout << "~Test()" << endl; } Test(const Test&);/

2020-07-26 08:32:15 27

原创 【C/C++内存管理】

1、c/c++内存划分图栈又叫堆栈,非静态局部变量/函数参数/返回值等等,栈是向下增长的。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。内存映射段是高效的I/O映射方式,用于装载一个共享的动态内存库。用户可使用系统接口创建共享共享内存,做进程间通信。堆用于程序运行时动态内存分配,堆是可以上增长的。数据段–存储全局数据和静态数据。代码段–可执行的代码/只读常量2、C语言内存管理方式动态内存管理(1) 为什么要有动态内存管理?因为常规空间开辟的方式,开

2020-07-23 08:42:57 30

原创 【指针传参问题C】

改变变量用一级指针,改变指针用二级指针1)改变值void fun(int *p){ int b = 100; p = &b; // 将p指向b,改变的是局部变量的值,实参不受影响}void fun2(int *p){ *p = 100; // 将p指向的变量赋值100,改变的是实参指针指向的值,实参会受到影响 //} //改变变量用一级指针,改变指针用二级指针,main(){ int .

2020-07-22 11:33:39 40

原创 【关于类的练习】

1、计算一个类创建了多少个对象#include<iostream>using namespace std;class temp{ static int a;public: temp() { ++a; } temp(const temp& b) { ++a; } static int GetA() { return a; }};int temp::a = 0;int main(){ cout << temp::GetA(

2020-07-21 15:24:28 19

原创 【c++类初始化列表、staic成员、内部类、友元】

一、构造函数整体赋值与初始化列表赋值1、整体赋值class Date{public:Date(int year, int month, int day){_year = year;_month = month;_day = day;}private:int _year;int _month;int _day;};上面的代码为整体赋值,调用构造函数后,对象会有一个初值。但是,其只能称为赋初值****而不是初始化,因为初始化只能有一次,而构造函数体内可以多次赋值。2、初始

2020-07-21 10:07:43 27

原创 【c++类的默认六个成员函数详解】

类的六个默认成员函数构造函数析构函数拷贝构造赋值运算符重载取地址运算符重载const修饰的取地址运算符重载为什么要有这些默认成员函数?如果一个类,在初始化之前就调用了打印函数,则会导致输出的是一个随机值,为了避免这种情况,所以c++给了六种默认成员函数。并且任何一个类在不写的情况下都会自动生成6个默认成员函数。一、构造函数1、什么是构造函数?它的作用?构造函数就是在创建类对象的时候,由编译器自动调用,为对象进行初始化的一个特殊成员函数。它的名称和类名相同,并且在对象的声明周期

2020-07-12 20:21:47 82

原创 【日期类的实现c++】

代码:#include<iostream>using namespace std;//实现一个日期类class Date{public: int GetMonthDay(int year, int month) { int monthDays[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; if (month == 2 && ((year % 4 == 0 &&

2020-07-12 19:12:20 24

原创 【c++类定义、内存对齐、大小端、this指针】

C语言是面向过程的语言,而C++是面向对象的语言,那么类与对象到底是什么呢?1、什么是类?C++的类和结构体与C语言的结构体差不多,不过C语言结构体中只能定义变量,而C++的结构体和类内不仅可以定义变量,也可以定义函数。struct ListNode_C//c语言的结构体{ int _val; struct ListNode_c* _next; //只有加上struct才是一个类型 struct ListNode_c* _prev;};struct ListNode_CPP/.

2020-06-29 14:27:35 61

空空如也

空空如也

空空如也

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

TA关注的人 TA的粉丝

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