- 博客(66)
- 收藏
- 关注
原创 C++多态解析
什么是多态?多态(Polymorphism)按字面的意思就是“多种状态”。在面向对象语言中,接口的多种不同的实现方式即为多态。构成多态的条件1.有继承关系2.虚函数的重写2.通过基类对象的指针或者引用调用虚函数什么是虚函数类的成员函数前加上virtual关键字,就构成了虚函数。虚函数的重写当在子类定义一个与父类完全相同的虚函数时,我们就称,子类的虚函数重写(覆盖)了父类的虚函数。...
2019-12-20 12:05:45
333
原创 C++智能指针
什么是智能指针?为什么要有只能指针?在C++程序里,使用new关键字开辟的内存必须被手动delete掉,不然就会导致内存的泄漏,但是,当程序非常冗长,你能保证自己每一个手动开辟的内存块都释放了吗?在delete之前,倘若程序因为异常跳转后,你还能保证内存被释放吗?为了解决这种因为遗忘或者异常处理而导致内存泄漏的问题,我们就要用智能指针。智能指针运用了一种叫做RAII的技术,即利用对象生命周期来...
2019-12-20 01:17:55
167
原创 C++之多继承
什么叫多继承多继承就是一个子类有两个及以上的父类。多继承的方式一般形式:菱形继承:第一种继承方式:派生类会同时拥有两个基类的特性(属性和方法,也就是两个类的所有成员)。第二种继承方式:这个结构中类C同时拥有类B1和类B2的特性,但是这就会产生一个问题,上述两个类都继承自类A,那么类C的对象会同时包含两个A的对象。这样就会带来数据冗余和二义性问题。菱形继承:class Perso...
2019-12-20 00:10:44
733
原创 C++继承解析
继承的概念及定义继承的概念继承是面向对象程序设计使代码可以重复使用的重要手段,它可以在原有类的基础上进行扩展,增加功能,产生新的类,称为派生类,派生类拥有原有类的所有成员,是一种类的复用的重要思想。继承的定义继承定义的格式:派生类的继承方式和对基类成员访问权限:总结:1.基类private成员在派生类中无论以什么方式继承都是不可见的。这里的不可见是指基类的私有成员还是被继承到了派...
2019-12-19 17:30:43
182
原创 哈希表的实现(哈希桶 开链法)
哈希桶不是使用更改状态来表示删除,而是采用了链表的删除和插入操作。因为采取了链表和vector结合的做法,所以在结点设计上删去了_status(状态),增加了一个指向下一个结点的指针_next。template<class K, class V>struct HashTableBucketNode{ K _key; V _value; HashTableBucketNod...
2019-12-12 11:05:18
231
原创 哈希表的实现(开放定址法)
enum Status{ EMPTY, EXIST, DELETE,};template<class K, class V>struct HashTableNode{ K _key; V _value; Status _status; HashTableNode(const K& key = K(), const V& value = V()...
2019-12-12 10:10:25
482
原创 哈希表介绍
Hash表概念在顺序结构及树中,元素关键码与其存储位置之间没有对应关系,所以查找的时候要进行多次的比较,有没有一种搜索方法,可以不经过任何比较,一次直接获得想要搜索的元素。构造一种存储结构,通过某种函数(hashFunc)使元素的存储位置与它的关键码之间能够建立一一映射的关系,根据这种想法构造了Hash表。当向该结构中:插入元素根据待插入元素的关键码,以此函数计算出该元素的存储位置并按此位...
2019-12-12 01:12:20
239
原创 unordered_map的介绍与使用
unordered_map介绍1.unordered_map是存储<key, value>键值对的关联式容器,其允许通过key快速的索引到与其对应的 value。2.在unordered_map中,键值通常用于惟一地标识元素,而映射值是一个对象,其内容与此键关联。键 和映射值的类型可能不同。3.在内部,unordered_map没有对<kye, value>按照任何特...
2019-12-11 23:14:21
3409
原创 红黑树
红黑树的概念红黑树,是一种二叉搜索树,但在每个结点上增加一个存储为表示结点的颜色,可以使Red或Black。通过对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路径会比其他路径长出两倍,因而是接近平衡的。红黑树的性质1.每个结点不是红色就是黑色2.根节点是黑色的3.如果一个节点是红色的,则它的两个孩子结点是黑色的4.对于每个结点,从该结点到其所有后代叶结点的简单路...
2019-12-11 17:09:16
115
原创 AVL树
1.什么是AVL树AVL树是二叉搜索树的优化版,又称平衡二叉搜索树,高度平衡树。我们都知道当一棵二叉搜索树的结点一直单边插入时,这时候它的查找效率趋近O(n),非常慢。而AVL树的特是:“AVL树中任何结点的两个子树的高度最大差别为1” ,这样就克服了结点单边存储而导致查找效率低下的问题。如上图,左边是AVL树,右侧为非AVL树,右子树高度减去左子树的高度(简称平衡因子)的绝对值不超过1(...
2019-12-06 11:10:00
200
原创 map与set
Map介绍Map是一组成对的键值对对象,允许使用键(key)来查找(value)。它提供了一个映射表,可以通过某个对象来查找另一个对象。它也被称作关联数组,因为它将某些对象与另外一些对象关联在一起;或者称作字典,通过键对象来查找值对象,就像在字典中使用单词来定义一样。Map特点map是关联容器,它按照特定的次序(按照key来比较)存储由键值key和值value组合而成的元素。在map中,...
2019-12-06 10:13:51
97
原创 C++中vector与list的区别
底层结构vector:底层为动态顺序表,在内存中是一段连续的空间。list:底层结构是带头结点的双向循环链表,在内存中不是一段连续的空间。随机访问vector:支持随机访问,可以通过下标直接访问某个元素,访问某个元素的时间复杂度为O(1)。list:不支持随机访问,只能通过从前向后或从后向前依次遍历来访问某个元素,时间复杂度是O(N)。插入和删除vector:任意位置插入和删除效率低...
2019-12-03 23:55:27
381
原创 vector中迭代器失效问题
当使用vector容器时,如果进行以下2中操作中的一种:1.vector已满情况下再进行插入操作。2.使用erase()删除数据。就会导致迭代器失效。插入操作举例:#include<iostream>#include<vector>using namespace std;int main(){ vector<int> v; v.push...
2019-12-03 00:05:20
146
原创 深浅拷贝及写实拷贝
浅拷贝对于String类的拷贝构造早函数及operator=函数来说,当用一个string对象拷贝构造或复制给另一个String对象时,就是讲这个对象里的指针的值赋值给另一个对象里的指针。讲一个帧赋值给另一个指针,就会使得两个指针指向同一块空间,就产生了浅拷贝。class String{public: String(const char* str) :_str(new char[st...
2019-11-24 00:19:07
133
原创 单例模式
什么是单例模式单例模式是一种常用的设计模式。它能够保证系统中应用该模式的类只有一个实例,并提供一个访问它的全局访问点,该实例被所有程序模块共享。单例模式实现方式单例模式的实现有两种方式:饿汉模式和懒汉模式。饿汉模式该种模式是不管你将来用不用,在程序运行之初就将对象创建好,程序启动时就创建唯一的实例对象。在访问量比较大,或者可能访问的线程比较多时,采用饿汉模式实现,可以实现更好的性能。以空...
2019-11-23 00:47:10
98
原创 设计一个类只能在堆(或栈)上创建对象
设计一个类,只能在堆上创建对象。思考:1.因为无论是在堆上还是在栈上创建对象,都要调用构造函数。所以要防止在栈上创建对象,构造函数要私有化。2.因为构造函数的私有化,所以不能在类外调用构造函数,那么类中就要有一个共有的成员函数,在其中new一个对象出来。但是在调用该成员函数的时候又必须先创建一个对象才能调用,所以这个时候将该成员函数设置成静态函数,这样就能够只通过类名来访问这个静态成员函数了...
2019-11-22 22:02:26
337
原创 C++类和对象——6个默认成员函数
在C++中有了个默认成员函数:1.构造函数2.析构函数3.拷贝构造函数4.赋值运算符重载5.取地址符重载6.const修饰的取地址符重载介绍上述的成员函数之前先介绍在这写成员函数中会用到的两个概念:1.函数重载(1)相同的范围(在同一个类中);(2)函数名字相同;(3)参数个数或数目不同。2.缺省函数缺省函数就是在声明函数的某个参数的时候指定一个默认值,在调用这个函数的时...
2019-08-14 21:35:57
113
原创 迷宫问题(C语言)
第一类 简单迷宫(不含多条出路,不带环)(0代表墙,1代表通路)示意图:思路分析:1.以入口为起点,寻找出口(除了起点以外的边缘上的点)2.判定当前点坐标是否可以走。(坐标合法且不为0)3.如果合法则将当前点标记成走过的并入栈(维护一个栈可以记录走过的路径,栈的长度就是路径的长度)4.判断当前点是否是出口,是出口就return(该迷宫不存在别的出口),如果不是出口,以顺时针的方向(上...
2019-08-14 20:56:06
1173
原创 “随心所语”
该项目使用的技术:1.C++STL2.生产者消费者模型3.多线程技术,线程的同步与互斥4.网络编程5.开源jsoncpp库6.ncurses库7.自定义协议,登录注册认证实现的基本想法:项目分可分为3个模块:1.登录、注册和退出 2.用户发送消息,服务器接收 3.服务端的数据转发1.登录和注册(TCP)注册:将自己的注册信息通过TCP发给服务器,服务器接收下来并保...
2019-03-30 17:38:12
170
原创 七大经典排序算法
1.冒泡排序基本思想:比较相邻两个数,如果前者比后者大,则进行交换。每一轮交换结束,会有一个最大的数放在数组的最后面,经过N-1轮,排序完成。oid Bubble_Sort(int* a, int size){int temp = 0;for (int i = 0; i &lt; size - 1; i++){for (int j = 0; j &lt; size - 1 - i; j...
2019-03-13 12:23:45
227
原创 文本相似度
说明:在VS2015 环境的Release 的模式下(Debug模式下运行速度太慢)TextSimilarity.h#pragma once#include <unordered_map>#include <string>#include <unordered_set>#include <cppjieba/jieba.hpp>cla...
2019-02-20 21:18:02
491
原创 Linux下重要命令,权限及gcc/g++,gdb,vim的安装
Linux重要命令:su 切换用户-c<指令>或–command=<指令>:执行完指定的指令后,即恢复原来的身份;-f或——fast:适用于csh与tsch,使shell不用去读取启动文件;-l或——login:改变身份时,也同时变更工作目录,以及HOME,SHELL,USER,logname。此外,也会变更PATH变量;-m,-p或–preserve-env...
2018-10-06 11:08:52
710
原创 Linux常用命令
linux的命令操作:命令的使用结构命令名称 【操作选项】【操作对象】【操作目标对象】对目录进行操作(目录-文件夹)ls:查看目录下的内容-a 查看隐藏文件linux下,以点开头的文件都是隐藏文件.:代表当前目录…:代表当前目录上层目录-l 列出目录下内容详细信息-t 按时间进行排序-tr逆序-h 人性化 显示pwd:查看当前所在目录/home/san:绝对路径(以根...
2018-10-06 11:03:11
186
原创 简单贪吃蛇
snack.h#ifndef __SNAKE_H__#define __SNAKE_H__#include <stdio.h>#include <windows.h>#include <stdlib.h>#include <time.h>enum Direction{ UP = 1, DOWN, LEFT, ...
2018-09-24 17:52:47
149
原创 二叉树的基本操作及应用
BTree.h#ifndef __BTree_H__#define __BTree_H__ #include<stdlib.h>#include<stdio.h>#include<assert.h> typedef char DataType; typedef struct BTreeNode{ DataType data; struc...
2018-09-20 17:41:32
1042
原创 堆及堆的应用
Heap.h#ifndef __HEAP_H__#define __HEAP_H__typedef int HPDataType;typedef struct Heap{ HPDataType* _hp; int _capacity; int _size;}Heap;typedef struct PriorityQueue { Heap hp;...
2018-09-16 08:28:32
369
原创 Linux根目录下各目录功能
/bin:存入普通用户可以使用的命令文件.目录/usr/bin 也可用来贮存用户命令。/sbin: 一般存放非普通用户使用的命令(有时隔不久普通用户也可能会用到).目录/usr/sbin中也包括了许多系统命令。/etc:系统的配置文件。/root:系统管理员(root或超级用户)的主目录。/usr:包括与系统用户直接相关的文件和目录,一些主要的应用程序了保存在该目录下。/h...
2018-09-05 16:22:01
158
原创 栈的应用之逆波兰表达式求值
Reversed Polish Notation.h#ifndef __ReversedPolishNotation_H__#define __ReversedPolishNotation_H__#define MAXSIZE 10typedef int DataType;//定义栈typedef struct StackNode{ DataType arr[MAX...
2018-08-31 02:26:39
357
原创 栈的应用之括号匹配问题
MatchBrackets.h#ifndef __MatchBrackets_H__#define __MatchBrackets_H__#define OK 0;#define ERROR 1;#define STACK_INIT_SIZE 100#define STACKINCREACE 10typedef int ElemType;typedef int Status...
2018-08-31 02:24:03
299
原创 栈的基本操作
Stack.h#ifndef __STACK_H__#define __STACK_H__#define MAXSIZE 10typedef int DataType;//定义栈typedef struct StackNode{ DataType arr[MAXSIZE]; int top;}Stack, *pStack;int EmptyStack(...
2018-08-31 02:20:51
125
原创 队列的基本操作
QUEUE.h#ifndef __QUEUE_H__#define __QUEUE_H__typedef int QDataType; typedef struct QListNode { struct QListNode* _pNext; QDataType _data; }QListNode; typedef struct Queue { ...
2018-08-31 02:18:04
128
原创 带头结点的双向循环链表
DList.h //头文件#ifndef __DLIST_H__#define __DLIST_H__typedef int DataType;typedef struct DListNode{ struct DListNode* _pNext; struct DListNode* _pPre; DataType _data;}DListNode;...
2018-08-30 23:39:22
906
原创 单向链表的基本操作及常见面试题
一、单链表的基本操作 1、初始化链表 2、尾部插入 3、尾部删除 4、头部插入 5、头部删除 6、销毁链表 7.打印单链表内容 8、查询数据为d的节点 9、在指定位置之前插入一个节点 10、指定位置节点删除 11、删除数据为d,第一次出现的节点 12、删除数据为d的所有节点 二,链表常见面试题 1、删除指定位置的非尾节点 2、获取链表长度3、逆序打印单链表4、在无...
2018-08-12 22:59:02
334
原创 顺序表
seqList.h#define _CRT_SECURE_NO_WARNINGS 1 #ifndef _SEQLIST_H__ #define _SEQLIST_H__ #include<stdio.h> #include<stdlib.h> #include<assert.h> #include<string.h>...
2018-06-23 15:33:25
112
原创 注释转换(C转C++)
commentConvert.h#ifndef _COMMENT_CONVERT_H__#define _COMMENT_CONVERT_H__#include<stdio.h>#include<stdlib.h>enum State{ NUL_STATE,//无注释状态 C_STATE,//C语言注释状态 CPP_STATE,//...
2018-06-15 17:20:03
140
原创 通讯录(文件存储)
#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>#include <stdlib.h>#include <assert.h>#include<string.h>struct person { char name[32]; char phone[12]; ...
2018-06-08 11:42:15
1128
原创 通讯录
#define _CRT_SECURE_NO_WARNINGS 1#include&lt;stdio.h&gt;#include &lt;stdlib.h&gt;#include &lt;assert.h&gt;#include&lt;string.h&gt;struct person {//构建结构体 char name[32]; char
2018-06-08 10:48:29
161
原创 自定义类型:结构体,枚举,联合知识点总结
结构体是一种复合类型,其中包括很多的数据类型。 例如:struct Stu//Stu是结构体标签,可省略{ char name[20]; int age; char sex[5]; char id[20];};//分号不能省结构体成员结构体成员可以是标量、数组、指针,甚至是其他结构体。结构体成员的访问1,用 结构体名称 x . +x成...
2018-06-02 16:51:07
225
原创 模拟实现strncpy ,strncat,strncmp 函数
1.模拟实现strncpy char *my_strncpy(char *dest, const char*src,int count){ char*p = dest; assert(dest != NULL); assert(src != NULL); while(count--) { *dest = *src; dest++; ...
2018-05-25 16:32:57
194
原创 模仿qsort的功能实现一个通用的冒泡排序
#include<stdio.h>#include<string.h>struct Stu //结构体 { char name[20]; int age; };int cmp_stu_name(const void *e1, const void *e2){ return strcmp(((struct Stu*)e1)->na...
2018-05-14 09:24:03
131
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人