- 博客(85)
- 收藏
- 关注
原创 内存池的实现
根据C++STL中的空间配置器,实现一个轻量级的内存池,由于空间配置器虽然解决了外部碎片的问题,提高了效率,但它的缺陷在于若使用二级空间配置器,它不会主动释放已经空闲的内存块,还给操作系统,而是将自己申请的内存块全部挂在自由链表上,自己不用,别的进程也不可以用,造成极大的内存空间的浪费,很可能导致很多别的进程无内存可用的情况。而轻量级的内存池不仅解决外部碎片问题,并且解决释放内存问题,它使用多少用
2017-04-18 16:48:00
1027
原创 Linux下find命令的解析
find命令在目录结构中搜索文件,并执行指定的操作,掌握它的形式与用法。 1.find命令的格式 find pathname -options [-print -exec -ok ...] 2.命令参数 pathname: find命令所查找的目录路径。例如用.来表示当前录,用/来表示系统根目录; -print:find命令将匹配的文件输出到标准输出;
2017-03-28 19:47:44
7579
原创 STL二级空间配置器
在前面博客已经实现了一级空间配置器,博客链接如下:http://blog.csdn.net/l_xrui/article/details/645008981.首先明白为什么需要二级空间配置器?我们知道动态开辟内存时,要在堆上申请,但若是我们需要不断的在堆上开辟小块内存,释放,开辟释放,则就会再堆上造成很多外部碎片,浪费了内存空间;并且由于每次都要进行调用malloc、free函数,
2017-03-27 20:30:26
1031
原创 局部、局部静态、全局、全局静态变量联系区别
局部、局部静态、全局、全局静态变量联系区别:首先明白6大作用域:全局作用域、局部作用域、文件作用域、命名空间作用域、语句作用域、类作用域1.从作用域区别:局部与局部静态变量作用与局部作用域;全局变量作用与全局作用域,若一个程序中有多个源文件,它定义与一个源文件,即所有文件都可以通过extern关键字使用全局变量,链接属性为外部;全局静态变量则作用与文件作用域,即当程序中有多个源
2017-03-27 14:18:30
1088
原创 string类写时拷贝的模拟实现
为了解决string类中浅拷贝的问题,在windows系统下它则以深拷贝来解决这一问题,由于深拷贝要不断的开辟内存空间,并花费时间,所以在linux/unix系统下则采用写时拷贝(Copy_On_Write)来实现:它依然以浅拷贝实现为主,以指针的值传递,但是它多加了引用计数,当多个对象指向同一块空间,引用计数则统计对象个数,当只是读的时候就不用开辟新的内存,析构时根据引用计数值是否为1判断是
2017-03-23 18:12:12
1017
原创 String类深拷贝的模拟实现
深拷贝浅拷贝分析:浅拷贝:也称位拷贝,编译器只是直接将指针的值拷贝过来,结果多个对象共用同一块内存,当一个对象将这块内存释放掉之后,另一些对象不知道该块空间已经还给了系统,以为还有效,所以在对这段内存进行释放操作的时候,一个内存空间被释放多次,发生了访问违规,程序崩溃。如图:深拷贝:为了解决浅拷贝的问题,深拷贝则不是直接将指针的值拷贝,它是为指针p2开辟与p1相同大小的内存空间
2017-03-23 13:47:33
1264
3
原创 STL一级空间配置器
在STL中,空间配置器是容器必不可少的东西,它为容器中的数据提供空间存储,由于考虑小型区块可能造成的内存碎片问题,STL中设计了双层级配置器,当开辟内存>128bytes时,就会调用第一级配置器,在这里我们将根据其源码模拟实现它的第一级配置器。STL 第一级配置器代码实现:#pragma once//一级空间配置器#define __THROW_BAD_ALLOC 0t
2017-03-21 21:13:12
1024
原创 Linux目录文件权限与ACM时间
Linux系统下目录权限与目录下创建文件的权限分析:1.探究进入一个目录user需要什么权限:首先建立一个目录如下:可知dir目录user拥有者权限为:rwx(可读可写可执行);现在要进入这个目录:在rwx权限下可以进入dir目录此时去除r权限:在-wx权限可以进入dir目录此时去除w权限:在--x权限可以进入dir目录;此时
2017-03-20 17:35:03
1113
原创 多态概念总结
以下全部总结讲解或代码举例在VS2010编译器下进行:一、基本概念多态:具有多种形式或形态的情形(最初来源于希腊语,在C++中有广泛的含义)。多态分类图:静态多态:编译器在编译期间完成的,编译器根据函数实参的类型(可能会进行隐式类型的转换),可推断出要调用哪一个函数,如果有对应的函数就调用该函数,否则出现编译错误。举例如上图函数重载实现静态多态:class A{publ
2017-03-17 17:36:02
3369
原创 并查集实现解决小米面试题朋友圈问题
并查集:将N个不同的元素分成一组不相交的集合,开始时,每个元素就是一个集合,然后按规律将两个集合进行合并。举例如:(1)现在有10个元素:0,1,2,3,4,5,6,7,8,9;分别将每个元素看成一个集合,则可将它们看作数组下标,数组里先存储-1,代表都为根,如:(2)现在知道有元素下列不相交集合关系:则在上面数组基础上创建这些集合关系,数组变为:过程为:以第一个
2017-03-17 17:19:34
1754
原创 动态内存开辟:new/delete,malloc/free区别与联系
本博客主要说明new/delete,malloc/free的区别与联系,如下:1.malloc/free为C的标准库函数,函数原型为:void* malloc(size_t size)//参数代表字节个数void free(void* pointer)//参数代表内存地址new、delete则为C++的操作运算符,它调用的分别为赋值运算符重载operator new()和operator
2017-03-17 16:17:56
4418
1
原创 继承与多态虚函数分析
此处举例在VS2010中编译:分析继承与多态在内存中的分配过程,直接以多继承举例:首先说明虚表的概念:虚表1.继承中没有虚函数,举例:class Base1{public: void Func1() { cout<<"Base1"<<endl; }public: int _a;};class Base2{public: void Func2() {
2017-03-16 19:23:47
959
原创 STL库:set和map的使用和原理
set和map是C++标准库中的关联容器,它们中的所有元素都会根据元素的键值(key)自动被排序,又由于红黑树(RB-tree)是一种平衡二叉搜索树,自动排序效果非常好,所以标准的STL中的set和map容器都是以红黑树(RB-tree)为底层机制,又由于map和set所开放的各种操作接口,RB-tree也提供了,所以它们几乎所有的操作行为,都只是转调RB-tree的操作行为。set介绍:se
2017-02-16 12:51:12
1275
原创 红黑树实现
红黑树:是一棵二叉搜索树,它在每个节点上增加了一个存储位来表示节点的颜色,可以是Red或Black。通过对任何一条从根到叶子简单路径上的颜色来约束,红黑树保证最长路径不超过最短路径的两倍,因而近似于平衡(由于性质中红色节点不连续,最短路径可为全是连续黑结点,最长路径则由于红节点不连续,则每间隔一个黑的插入一个红的节点,所以最长路径为两倍)。 它主要满足以下几个性质: 1. 每个节点,不是红
2017-02-15 23:20:39
843
原创 哈夫曼树
哈弗曼树(Huffman tree):是最优二叉树,加权路径最短的二叉树。贪心算法:是指在问题求解时,总是做出当前看起来最好的选择,即为贪心算法做出的不是整体最优的选择,而是某种意义上的局部最优解,贪心算法不是对所有的问题都能得到整体最优解。思想:这里使用贪心算法构建哈弗曼树,运用最小堆的思想,建立最小堆,每次从堆中找最小的两个节点构造新结点,新结点再放回堆中,并连接两个旧的结点,按相同方
2017-01-29 17:25:24
995
原创 大数据处理堆实现N个数据找K个最大数据和堆排序
在N个数据中找K个最大数据思想:用堆实现找最大的数据,则先建立一个N个数据中其前K个节点的最小堆,将没进入最小堆的节点依次与小堆的头节点比较,若大于头节点,则替换两个值,并且调用向下调整算法(其思想前面博客已经介绍实现),直到N个数据比较完成,此时最小堆中的K个节点即为N个数据中的K个最大数据。在代码中为了方便测试N与K的值较小。堆排序思想:即建立一个堆来实现排序,升序与降序思想基本相同,
2016-12-31 15:10:25
2774
原创 大小堆的实现与实现优先级队列
堆:可视为一棵完全二叉树结构,最小堆每个父节点都小于孩子结点,最大堆每个父节点都大于孩子结点。建堆思想:实现向下调整算法AdjustDown():即当一个节点的左子树和右子树都已为最大堆或最小堆(在这里则寻找树倒着走的第一个非叶子结点,依次进行调整),比较其左右孩子结点满足大堆或小堆要求的节点,再与此节点比较,若孩子结点大,满足大堆交换两节点值,或小堆,孩子结点小则交换。大堆与小堆思想基本相同
2016-12-31 14:44:48
1168
原创 STL容器中list与迭代器iterator的模拟实现
list在容器中结构是有一个头结点_head,头结点指向第一个结点,尾结点指向头结点,它为双向循环链表,在其中它有自己的迭代器可以类似于智能指针,用于数据的访问和算法的配合。代码实现:#include #include #include #include using namespace std;template struct _ListNode //结点结构{ T
2016-12-30 16:03:55
2159
原创 面试题atoi的模拟实现
atoi函数:用来把一个字符串转换为整数,在模拟实现应注意以下几点:1.检查字符串是否为空字符串;2.区分空字符串与0字符返回值结果,这里用一个全局变量globle来区分;3.考虑字符串的合法输入,如‘+’'-'号(并能区分),‘1~9’字符为合法输入;4.考虑计算过程中的溢出。代码实现:#include #include #include using namespa
2016-12-30 12:12:17
874
原创 单链表的面试题系列
在这里简单实现了单链表的基本操作,重点实现单链表的各种面试题。代码如下:头文件LinkList.h:#ifndef __LinkList_H__#define __LinkList_H__#include #include #include #include typedef int DataType;typedef struct Node{ DataType dat
2016-12-30 11:32:40
1097
原创 动态顺序表的实现
对顺序表的动态开辟空间实现,并对顺序表进行操作,实现增删查改排序等一系列操作。代码实现:头文件SeqList.h:#include #include #include #include typedef int DataType;#define MAX_SIZE 3 //初始顺序表大小#define INC_SZ 3 //每次增容大小typedef s
2016-12-30 11:22:04
1205
原创 二叉树递归与非递归遍历实现
二叉树:将一数组创建二叉树,四种遍历方法:前序,中序,后序,层次遍历,与求不同情况下的结点个数等。代码实现:#include #include #include #include #include using namespace std;template struct BinaryTreeNode{ T _data; BinaryTreeNode *_left; B
2016-12-29 22:54:28
1968
原创 对称矩阵和稀疏矩阵的压缩和转置
对称矩阵:N*N方阵A,特点Aij=Aji,对角线分割为上三角和下三角,压缩存储只需存储下三角数据。稀疏矩阵:矩阵中有效数据很少,在存储时只存储有效数据,非法数据不存,在实现中创建一个结构体表示一个有效数据,并以行优先级先后顺序依次存放,并对稀疏矩阵实现转置和快速转置。代码实现:#include #include #include #include using namespac
2016-12-29 22:34:58
1239
原创 关于栈与递归求解迷宫与迷宫最短路径问题
一、栈实现迷宫问题:问题描述:用一个二维数组模拟迷宫,其中1为墙,0为通路,用栈方法判断迷宫是否有出口,下图为简单模拟的迷宫:思想:1.首先给出入口点,如上图入口点坐标为{2,0};2.从入口点出发,在其上下左右四个方向试探,若为通路(值为0)时,则向前走,并将每次通路结点入栈(push)保存和标记走过的路为2;3.当四个方向都没有通路时,则开始回溯,将栈中保存的结点开
2016-12-03 13:11:24
4134
原创 栈与队列的实现
一、栈:特点:后进先出(LIFO),只允许在末端进行插入和删除,所以适用于用数组(即一段连续的空间)来实现,经常性在数组尾部插入删除代码实现:#include #include #include using namespace std;template class Stack{public: Stack() :_a(NULL) ,_size(0) ,_cap
2016-11-29 16:42:23
548
原创 C++类的继承总结
一、继承概念:是面向对象程序设计使代码可以复用的重要手段,保持原有类特性基础进行扩展,增加功能,产生新的类,称为派生类。定义格式:三种继承关系:public,protected,private三种类成员访问限定符:public,protected,private(需要与三种继承关系区别,不能混淆)举一个简单类:B公有继承(public)与Aclass A{publi
2016-10-26 11:31:19
1358
原创 日期计数器—C++实现
日期计数器实现:在程序中定义日期类:class Date{};,主要运用操作符重载知识在其中实现:日期加或减一定天数,日期减日期相差天数,两日期的各种比较与日期输入输出等功能。具体代码实现:#include #include using namespace std;class Data{ friend ostream& operator<<(ostream& _cout, con
2016-10-22 17:21:55
1659
原创 C++中类的构造函数
构造函数:1.定义:是一个特殊的成员函数,名字与类名相同,创建类类型对象时,由编译器自动调用,在对象的生命周期内只且只调用一次,以保证每个数据成员都有一个合适的初值。如:class Data{public: Data(int year,int month,int day) { _year=year; _month=month; _day=day; }private:
2016-09-26 22:54:24
933
原创 C++类中this指针的说明
this指针:1.说明:当程序中一个类定义了多个对象,多个对象都调用类中同一个成员函数时,此时怎么区别这个成员函数在哪个对象上操作,C++提供了this指针。如:class Data{public: void SetData(int year,int month,int day) { _year=year; _month=month; _day=day; }priv
2016-09-26 21:38:52
3119
原创 注释转换——C语言项目
注释转换:将C语言中的注释风格/*...*/转换为C++的注释风格//.转换方法先分析如下图:由图可以看出,将注释转换过程分为四种状态,NULL_STATE(无注释状态)、C_STATE(C语言注释状态)、CPP_STATE(C++注释状态)、END_STATE(文件结束状态),通过四种状态的相互切换实现注释的转换,具体实现过程为:用文件的方式中函数fopen打开源文件input.
2016-09-08 18:54:48
946
原创 C++构造函数简单实现电梯控制程序
对于电梯,属性之一就是位置,所以要实现这一程序,要设置电梯的初始位置和按下电梯按钮改变的电梯的位置。代码如下:#include #include #include using namespace std;class Elevator{private: int currentFloor; //电梯所处位置public: Elevator(int cfloor=1);
2016-09-05 19:06:55
7335
原创 通讯录(文件版)三
前两篇通讯录分别为静态版和动态版的,在这一篇中则在前两篇基础上对通讯录使用文件的方式,运用fopen和fclose函数打开或关闭一个文件,并运用fread和fwrite实现对此文件以二进制方式的读(r)写(w)操作,从而就可以在此文件中保存每次用户所添加、删除等操作的联系人信息,并在下一次使用通讯录时这些联系人信息都会显示,不用重新输入。和以前两版本相同,分别定义三个文件,代码如下:con
2016-08-08 14:37:23
859
原创 结构体内存对齐的补充说明与总结
在第一篇博客已经对结构体内存对齐进行了一些简单的说明,在这篇则对其进行一些总结和补充说明:总结:结构体内存对齐中存在默认对齐数(不同平台不一致),VS中为8,Linux中为4,也可以自己设定,在VS中运用#program pack(4),可将8改为4,最后可以用 #program pack()取消;1:必须了解偏移值,如图:数字0、1、2、3、4、5、6、7、8
2016-08-06 21:30:36
938
原创 通讯录(动态版)二
上一篇通讯录是静态版的,在结构体中直接定义了一个容量大小为1000的数组Dhb[],在这一篇则是通过用malloc和free函数实现动态内存分配和释放,并运用realloc函数实现原分配内存的扩大或缩小,从而比静态版的通讯录更加节省空间,更加灵活,不会浪费内存空间或存在内存不够的问题。和静态版通讯录一样,分别定义三个文件,代码如下:contact.h#ifndef __CONTACT_
2016-08-06 12:58:52
651
原创 通讯录(静态版)一
用c语言实现一个静态版的通讯录(采用静态顺序表的方式)在这里分别用一个头文件contact.h封装结构体与函数声明,测试文件test.c封装主函数与测试函数,contact.c实现各个函数的功能...........contact.h#ifndef __CONTACT_H__#define __CONTACT_H__#include #include #include #i
2016-08-05 15:47:51
608
原创 三子棋小游戏
头文件game.h部分:#ifndef _GAME_H_#define _GAME_H_#include #include #include enum OP{ QUIT, PLAY};#define ROWS 3#define COLS 3typedef unsigned int uint;void init_board(char board[ROWS][COL
2016-07-22 22:37:45
727
原创 各种小程序:(运动员名次与谁是凶手等)
/*5位运动员参加10米台跳水比赛,有人让他们预测比赛结果A选手说:B第一,我第三B选手说:我第二,E第四C选手说:我第一,D第二D选手说:C最后,我第三E选手说:我第四,A第一比赛结束后,每位选手都说对了一半,请编程确定比赛的名次*/#include #include int main(){ int a=0; int b=0; int c=0; int d=0; i
2016-07-07 19:23:32
988
原创 简单的猜数字游戏,二分查找,杨辉三角
猜数字游戏:#include #include #include void Print_menu(){ printf("********请选择:**********\n"); printf("********1:开始游戏********\n"); printf("********0:退出游戏********\n");}void Guess_num(){ int input
2016-07-01 14:01:15
1440
原创 剑指offer面试题:二维数组中的查找
题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。分析:看到这个问题,我们首先应该从这个二维数组的右上角或左下角开始查找,一步一步缩小查找范围,例如,查找一个二维数组matrix[][]中的7: 1 2 8 9
2016-06-18 16:20:50
835
原创 剑指offer面试题:替换空格(将字符串每个空格替换为%20)
题目:请实现一个函数,把字符串的每个空格替换成“%20”。例如:输入:“we are happy.”,则输出:“we%20are%20happy.”这里考虑的是在原来的字符串上做替换这一种情况:若我们用直接做法从头到尾扫描字符串,每碰到一个空格就做替换,其空格后面的字符都必须后移两个字节,如图:浅黄色背景代表需要移动的字符,紫色背景代表需要移动两次的字符,因此,若这样做,有O(n)
2016-06-15 21:41:33
3095
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅