自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 特殊类设计

1. 请设计一个类,只能在堆上创建对象实现方式:将类的构造函数私有,拷贝构造声明成私有。防止别人调用拷贝在栈上生成对象。提供一个静态的成员函数,在该静态成员函数中完成堆对象的创建。//只能在堆上创建对象的类// 1. 构造函数私有// 2. 提供一个静态的堆上创建对象的方法// 3. 防拷贝(拷贝构造声明为私有,且不实现, 或者声明为delete函数)class HeapOnly{public: static HeapOnly* getInstance() { //堆上创建对

2020-08-12 14:38:50 189

原创 智能指针

1. 为什么需要智能指针?避免以下Bug:内存泄露 :对象无法被释放,最常见的问题。野指针 : 指针指向未知。重复释放2. 内存泄漏什么是内存泄漏:内存泄漏指因为疏忽或错误造成程序未能释放已经不再使用的内存的情况。内存泄漏并不是指内存在物理上的消失,而是应用程序分配某段内存后,因为设计错误,失去了对该段内存的控制,因而造成了内存的浪费。内存泄漏的危害:长期运行的程序出现内存泄漏,影响很大,如操作系统、后台服务等等,出现内存泄漏会导致响应越来越慢,最终卡死。C/C++程序中

2020-08-10 08:26:10 161

原创 C++异常

1.C语言传统的处理错误的方式传统的错误处理机制:终止程序,如assert,缺陷:用户难以接受。如发生内存错误,除0错误时就会终止程序。返回错误码,缺陷:需要程序员自己去查找对应的错误。如系统的很多库的接口函数都是通过把错误码放到errno中,表示错误。C 标准库中setjmp和longjmp组合。这个不是很常用,了解一下实际中C语言基本都是使用返回错误码的方式处理错误,部分情况下使用终止程序处理非常严重的错误。2. C++异常概念异常是一种处理错误的方式,当一个函数发现自己无法处理的错误时

2020-08-09 09:02:59 232

原创 哈希的应用

位图所谓位图,就是用每一位来存放某种状态,适用于海量数据,数据无重复的场景。通常是用来判断某个数据存不存在的。给40亿个不重复的无符号整数,没排过序。给一个无符号整数,如何快速判断一个数是否在这40亿个数中。遍历,时间复杂度O(N)排序(O(NlogN)),利用二分查找: logN位图解决数据是否在给定的整形数据中,结果是在或者不在,刚好是两种状态,那么可以使用一个二进制比特位来代表数据是否存在的信息,如果二进制比特位为1,代表存在,为0代表不存在。比如位图的实现class BitM

2020-07-31 10:04:52 249

原创 哈希表

1. unordered系列关联式容器unordered_mapunordered_map是存储<key, value>键值对的关联式容器,其允许通过keys快速的索引到与其对应的value。在unordered_map中,键值通常用于惟一地标识元素,而映射值是一个对象,其内容与此键关联。键和映射值的类型可能不同。在内部,unordered_map没有对<kye, value>按照任何特定的顺序排序, 为了能在常数范围内找到key所对应的value,unordered_ma

2020-07-31 09:51:48 301

原创 红黑树

红黑树的概念红黑树,是一种二叉搜索树,但在每个结点上增加一个存储位表示结点的颜色,可以是Red或Black。 通过对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路径会比其他路径长出俩倍,因而是接近平衡的。红黑树的性质每个结点不是红色就是黑色。根节点是黑色的。如果一个节点是红色的,则它的两个孩子结点是黑色的。对于每个结点,从该结点到其所有后代叶结点的简单路径上,均 包含相同数目的黑色结点 。每个叶子结点都是黑色的。红黑树节点的定义enum Color{ BL

2020-07-25 17:51:13 133

原创 map和set

1.关联式容器关联式容器也是用来存储数据的,与序列式容器不同的是,其里面存储的是<key, value>结构的键值对,在数据检索时比序列式容器效率更高。2. 键值对用来表示具有一一对应关系的一种结构,该结构中一般只包含两个成员变量key和value,key代表键值,value表示与key对应的信息。3. 树形结构的关联式容器根据应用场景的不同,STL总共实现了两种不同结构的管理式容器:树型结构与哈希结构。树型结构的关联式容器主要有四种:map、set、multimap、multiset

2020-07-25 17:18:35 258

原创 二叉搜索树

二叉搜索树若它的左子树不为空,则左子树上所有节点的值都小于根节点的值。若它的右子树不为空,则右子树上所有节点的值都大于根节点的值。它的左右子树也分别为二叉搜索树。int a [] = {5,3,4,1,7,8,2,6,0,9};二叉搜索树的查找二叉搜索树的插入a. 树为空,则直接插入b. 树不空,按二叉搜索树性质查找插入位置,插入新节点插入10二叉搜索树的删除首先查找元素是否在二叉搜索树中,如果不存在,则返回, 否则要删除的结点可能分下面四种情况:a. 要删除的结点无孩子结点b

2020-07-13 09:12:43 184

原创 多态

多态的概念:通俗来说,就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会产生出不同的状态。多态的构成条件多态是在不同继承关系的类对象,去调用同一函数,产生了不同的行为。比如Student继承了Person。Person对象买票全价,Student对象买票半价。那么在继承中要构成多态还有两个条件:必须通过基类的指针或者引用调用虚函数。被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写。虚函数 即被virtual修饰的类成员函数。class Person {pub

2020-07-10 08:50:52 147

原创 继承

继承的概念继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类(子类),原本的类则称之为基类(父类)。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。继承是类设计层次的复用。继承及访问权限class Person{public: void Print() { cout << "name:" << _name << endl;

2020-07-10 08:35:04 98

原创 list用法了解

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

2020-06-28 09:18:46 384

原创 vector

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

2020-06-18 15:11:53 120

原创 string牛刀小试

//找字符串中第一个只出现一次的字符class Solution {public: int firstUniqChar(string s) { // 统计每个字符出现的次数 int count[256] = { 0 }; int size = s.size(); for (int i = 0; i < size; ++i) count[s[i]] += 1; // 按照字符次序从前往后找只出现一次的字符 for (int i = 0; i < size;

2020-06-15 17:24:10 99

原创 模板初阶

【本节目标】泛型编程函数模板类模板1. 泛型编程泛型编程最初提出时的动机很简单直接:发明一种语言机制,能够帮助实现一个通用的标准容器库。编写与类型无关的通用代码,是代码复用的一种手段。模板是泛型编程的基础。2. 函数模板函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型产生函数的特定类型版本。函数模板格式template<typename T1, typename T2,…,typename Tn>返回值类型 函数名(参数列表){}tem

2020-06-08 08:32:21 105

原创 C/C++内存管理

【本节目标】C/C++内存分布C语言中动态内存管理方式C++中动态内存管理operator new与operator delete函数new和delete的实现原理定位new表达式(placement-new)常见面试题1. C/C++内存分布int globalVar = 1;static int staticGlobalVar = 1;void Test(){ static int staticVar = 1; int localVar = 1; int num1[10

2020-06-02 10:25:40 130

原创 类与对象(下)

【本节目标】再谈构造函数C++11 的成员初始化新玩法。友元static成员内部类再次理解封装1. 再谈构造函数1.1 构造函数体赋值在创建对象时,编译器通过调用构造函数,给对象中各个成员变量一个合适的初始值。class Date{public: Date(int year, int month, int day) { _year = year; _month = month; _day = day; } private: int _year; int

2020-05-29 16:13:49 207

原创 类与对象(中)

[本节目标]类的6个默认成员函数构造函数析构函数拷贝构造函数赋值操作符重载const成员函数取地址及const取地址操作符重载1.类的6个默认成员函数2. 构造函数构造函数是一个特殊的成员函数,名字与类名相同,创建类类型对象时由编译器自动调用,保证每个数据成员都有 一个合适的初始值,并且在对象的生命周期内只调用一次。构造函数的主要任务并不是开空间创建对象,而是初始化对象。其特征如下:函数名与类名相同。无返回值。对象实例化时编译器自动调用对应的构造函数。构造函数可以重载

2020-05-27 09:42:01 150

原创 类与对象(上)

[本节目标]1.面向过程和面向对象初步认识2.类的引入3.类的定义4.类的作用域5.类的实例化6.类的访问限定符及封装7.类的对象大小的计算8.类成员函数的this指针1.面向过程和面向对象初步认识C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。C++是基于面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完成。2.类的引入C语言中,结构体中只能定义变量,在C++中,结构体内不仅可以定义变量,也可以定义函数。//C++stru

2020-05-21 09:37:38 118

原创 C++入门

【本节目标】命名空间C++输入&输出缺省参数函数重载引用内联函数auto关键字基于范围的for循环指针空值—nullptr什么是C++?C++是基于C语言而产生的,它既可以进行C语言的过程化程序设计,又可以进行以抽象数据类型为特点的基于对象的程序设计,还可以进行面向对象的程序设计。1.命名空间使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染namespace关键字的出现就是针对这种问题的。定义命名空间,需要使用到namespace关键字,后面跟命

2020-05-21 08:48:01 131

原创 数据结构与算法(5)排序

排序的概念排序:所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。稳定性:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,则称这种排序算法是稳定的;否则称为不稳定的。内部排序:数据元素全部放在内存中的排序。外部排序:数据元素太多不能同时放在内存中,根据排序过程的要求不能在内外存之间移动数据的排序。常见排序算

2020-05-13 10:18:24 242

原创 数据结构与算法 (4)二叉树

1.树概念及结构树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。1.有一个特殊的结点,称为根结点,根节点没有前驱结点。2.除根节点外,其余结点被分成M(M>0)个互不相交的集合T1、T2、……、Tm,其中每一个集合Ti(1<= i <= m)又是一棵结构与树类似...

2020-04-26 10:57:03 658

原创 数据结构与算法(3)栈和队列

1.栈栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。出栈:栈的删除操作叫做出栈。出数据也在栈顶。栈的实现一般可以使用数组或者链表实现,相对而言数组的结构实现更优一些。因为数组在尾上插...

2020-04-12 08:25:35 105

原创 数据结构与算法(2)线性表

线性表线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串…。线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的,线性表在物理上存储时,通常以数组和链式结构的形式存储。顺序表顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数...

2020-04-07 09:15:48 183

原创 数据结构与算法(1)

1. 什么是数据结构?数据结构(Data Structure)是计算机存储、组织数据的方式,指相互之间存在一种或多种特定关系的数据元素的集合。**2.**什么是算法?算法(Algorithm):就是定义良好的计算过程,他取一个或一组的值为输入,并产生出一个或一组值作为输出。简单来说算法就是一系列的计算步骤,用来将输入数据转化为输出结果。算法效率算法效率分析分为两种:第一种是时间效率,第二...

2020-04-07 08:00:03 121

原创 C语言文件操作

什么是文件文件有不同类型,在程序设计中,主要用到两种文件:1.程序文件。包括源程序文件(后缀为.c),目标文件(后缀为.obj),可执行文件(后缀为.exe)等。2.数据文件。文件的内容不是程序,而是供程序运行时读写的数据,如在程序运行过程中输出到磁盘(或其他外部设备)的数据,或在程序运行中供读入的数据。文件名一个文件要有一个唯一的文件标识,以便用户识别和引用。文件标识包括三部分:文件...

2020-03-22 12:38:17 455

原创 动态内存管理

为什么使用动态内存分配当你声明数组时,你必须用一个编译时常量指定的数组的长度。但是,数组的长度常常在运行时才知道,这是由于它所需要的内存空间取决于输入数据。例如,一个用于计算学生等级和平均分的程序可能需要存储一个班级所有学生的数据,但不同班级的学生数量可能不同。在这些情况下,我们通常采用的方法是声明一个较大的数组,它可以容纳可能出现的最多元素。但这种方法的缺点明显,这时候就需要动态开辟了。ma...

2020-03-22 10:26:50 98

原创 结构体,位段,枚举,联合

结构体结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。结构体的大小#include<stdio.h>struct s1{ char c1; int i; char c2;};struct s2{ char c1; char c2; int i;};struct s3{ double d; char c; int i;...

2020-03-14 18:54:54 99

原创 字符串函数的模拟实现

strlensize_t strlen ( const char * str );字符串已经 ‘\0’ 作为结束标志,strlen函数返回的是在字符串中 ‘\0’ 前面出现的字符个数(不包含 ‘\0’ )。参数指向的字符串必须要以 ‘\0’ 结束。注意函数的返回值为size_t,是无符号的。#include<stdio.h>#include<assert.h>...

2020-03-10 18:07:16 89

原创 指针题

问题一#include<stdio.h>int main(){ int a[5] = { 1,2,3,4,5 }; int* ptr = (int*)(&a + 1);//&a得到的是int(*)[5],ptr得到的是5后面的元素 printf("%d %d", *(a+1), *(ptr-1)); //结果就是2 5 return 0;}问题二#i...

2020-03-08 08:35:40 124

原创 sizeof和strlen

sizeof是运算符,参数可以是数组、指针等。strlen是函数,参数必须是字符型指针(char*)。数组int arr[] = {1,2,3,4};printf("%d\n", sizeof(arr)); // 16 printf("%d\n", sizeof(arr+0)); // 4 int* arr已经隐式转换为指针printf("%d\n", sizeo...

2020-03-03 16:20:54 102

原创 大端小端

计算机中的符号数有三种表示方法,即原码、反码和补码。三种表示方法均有符号位和数值位两部分,符号位都是用0表示“正”,用1表示“负”,而数值位,三种表示方法各不相同。原码 直接将二进制按正负数的形式翻译即可。反码 原码符号位不变,其它位按位取反。补码 反码+1。对整型而言,数据存放内存中其实存放的是补码。在计算机系统中,是以字节为单位的,每个地址单元都对应着一个字节,一个字节为8bit。但...

2020-02-26 20:53:16 126

原创 初学C之指针

指针即指针变量,在c语言中专门存储系统分配的内存地址,我们可以通过这个地址找到内存分配的空间,从而进行对变量进行操作。一个变量的地址称为该变量的“指针”。指针的形式:类型* 变量名。int* p表示了一个名字为p,类型为int 的指针变量,实际用来存放int变量地址。p=&a是将变量a的地址给指针p。如果一个指针变量指向了一个普通变量,那么,指针变量就完全等价于普通变量*指针变量...

2020-02-02 17:04:42 90

原创 初学C之数组

在C语言中,数组主要用来处理批量数据,是一组相同类型元素的集合。在绝大多数表达式中,数组名的值是指向数组的第一个元素的指针。两个例外:sizeof返回整个数组所占用的字节,单目操作符&返回一个指向数。用下标访问数组元素,数组的第一个元素下标从0开始。数组初始化:在定义数组时,可以用放在一对大括号中的初始化表对其进行初始化。初始化值的个数可以和数组元素个数一样多。如果初始化的个数多于元...

2020-01-27 17:39:42 178

原创 初学C之函数

函数就是功能,每个函数用来实现一个特定的功能。定义函数是为了调用函数,得到想要的结果。直接调用函数,可以为我们除去了许多没必要的麻烦。使用函数时必须先定义后使用,这样编译系统就会按照定义时所指定的功能执行。函数的参数是通过传值方式进行传递的,它实际所传递的是实参的一份拷贝。传值调用是把函数外部创建变量的内存地址传递给函数参数的一种调用函数的方式。函数在使用前要进行函数声明,就是告诉编译器有...

2020-01-22 15:31:32 94

原创 初学C语言之语句

C实现了其他现代高级语言所具有的所有语句,且都按照所预期的方式工作。根据所学知识及课本总结如下:if语句根据条件执行语句。while语句重复执行一些语句。for语句是while循环的一种常用形式的快速写法,它把控制循环的表达式收集放在一起,以便寻找。do语句与while语句类似,其区别在于do可以保证循环体至少执行一次。switch语句和其他语言的case语句差不多,但其在执行时会贯穿所...

2020-01-17 18:18:59 171

原创 初识C语言

近日初识C语言,让我对C语言有了一个初步的了解和认识,也知道了C语言的重要性。同时其作为一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言,很适合我们这类菜鸟学习入门。通过上课基本了解了C语言的基础知识,对C语言有了大概的认识,例如数据类型,变量常量,字符串之类的基础知识,为后面的深入学习打下基础。...

2020-01-12 16:19:53 296

空空如也

空空如也

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

TA关注的人

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