自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

颖豆豆啦

爱编程的小朋友

  • 博客(46)
  • 收藏
  • 关注

原创 类的const成员方法

const成员函数主要目的是防止成员函数修改对象的内容。即const成员函数不能修改成员变量的值,但可以访问成员变量。1、const成员方法在函数参数列表后加入const,只能由常对象调用,常对象不能调用普通成员方法。 2、调用的时候必须依赖一个对象 3、能访问私有和保护的成员 4、类的作用域在C++中,由const修饰的成员函数的函数体内部,是不能对成员变量进行修改的。这个特性用来...

2018-08-15 08:59:10 1939

原创 ELF文件的链接视图(obj)和执行视图(exe)

先来说一下obj文件和exe文件的组成格式吧。 obj文件组成格式ELF Header一共52个字节,用16进制表示0X34。通过readelf -h main.o命令可以查看文件头(-s 可以查看所有的段)。可以发现文件的开始先是ELF Header文件头,它包含了整个文件的基本属性(ELF文件版本、目标机器型号、程序入口等)。接着就是.text段,放的...

2018-08-08 13:31:24 4074

原创 private和protected的区别

首先这两个都是访问类中成员权限的限制符。 private是完全私有的,只有自己可以访问,派生类和外部都不可以访问 protected是受保护的,只有派生类可以访问,外部不能访问 在类外如果想使用类中的成员,只能直接使用public类型的,proteced和private都是不能访问的,对于类外而言,这两个是完全相同的。不能把私有数据的地址或引用泄露出去,外部可以改变私有数据的值。...

2018-08-08 13:23:20 36729 2

原创 野指针

野指针 eg:char* p = (char*)malloc(100); free(p); free掉之后p只是切断了和内存空间的关系,p指针本身内部所指的地址仍然不变,但是它对这个地址处的那一块内存却已经没有所有权了。如果不把它置为空,那这个指针就会变成一个野指针(悬垂指针)。 所谓的野指针就是指向一个已经被删除的对象或未申请访问内存受限的区域的指针。与空指针不同的是,野指针无法通过判断...

2018-08-08 13:22:18 176

原创 内存泄漏

什么叫内存泄漏? 内存泄漏一般是指堆内存的泄漏,动态的从堆上申请一块任意大小的内存,使用完没有显式释放内存,导致这块内存不能被再次使用。 有哪些内存泄漏? 1、浅拷贝。对于有指针对象的类,必须有显示的拷贝构造函数。 2、基类指针指向堆上的派生类对象。当通过delete想释放派生类对象的内存时,会导致派生类对象的析构函数无法调用,只调用了基类部分的析构函数,如果此时派生类的析构函数有释放额外...

2018-08-08 13:21:52 198

原创 static关键字

1、定义变量 静态全局变量和普通全局变量的区别: (1)作用域:头文件下的所有函数都可以用,两者相同 (2)生命周期:程序运行开始创建,程序结束才销毁,两者相同 (3)默认值:0,两者相同 (4)内存区域:全局(静态)变量区,两者相同 (5)唯一不同的就是链接属性,外部是否可链接。静态全局变量只能被文件内部的函数引用,普通全局变量可被多个文件引用。静态关键字其实也就是修饰链接属性,让其...

2018-08-08 13:20:29 106

原创 结构体位域/段

应用场景:有些信息在存储的时候,并不需要占用一个完整的字节,只需要占几个或一个二进制位。(比如开关变量,只有0和1两种状态,用一位二进制位即可)。 为了节省存储空间,C语言提供了一种数据结构,称为“位域”或“位段”。所谓“位域”就是把一个字节中的二进制位划分成几个不同的区域,并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作,这样就可以把几个不同的对象用一个字节的二进制位域来表示...

2018-08-08 13:19:43 174

原创 最少硬币个数

问题描述:假设有 1 元,3 元,5 元的硬币若干(无限),现在需要凑出 11 元,问如何组合才能使硬币的数量最少? 解题思路: 1、动态规划 假设总价值为i,先假设一个函数d(i)来表示需要凑出i的总价值需要的最少硬币数量。 当i=0时,我们不需要拼凑硬币,因为总价值为0 当i=1时,因为有1元我们需要1个1元,所以d(1)=1。 当i=2时,因为没有2元,所以我们需要2个1元,d(...

2018-08-08 13:18:29 2586

原创 最长公共前缀

问题描述: 一个数组中有很多字符串,找这所有字符串的公共前缀。如 “abc”, “abcdef”, “abcd”, 则返回”abc”。 解题思路: 首先最长公共前缀肯定小于或者等于最短字符串,设第一个字符串为公共字符串,公共字符串长度为第一个字符串的长度,遍历其他公共字符串,如果其他公共字符串比第一个字符串短,则公共字符串取较短的长度,如果其他字符串的字符不等于第一个字符串的字符,则退出比...

2018-08-08 13:17:12 628

原创 青蛙跳台阶问题

题目:一只青蛙一次可以跳上一级台阶,也可以跳上2级,求该青蛙跳上一个n级的台阶总共有多少种跳法。思路:首先考虑n等于0、1、2时的特殊情况,f(0) = 0 f(1) = 1 f(2) = 2 其次,当n=3时,青蛙的第一跳有两种情况:跳1级台阶或者跳两级台阶 假如跳一级,那么 剩下的两级台阶就是f(2);假如跳两级,那么剩下的一级台阶...

2018-08-08 13:16:14 120

原创 最大子矩阵和问题

从第一行到最后一行,将每一行的同列相加起来,可以得到一个一维数组,可以用最大子段和求这个一维数组中的最大子段,也就是最大子矩阵。 eg:矩阵为4 -2 9 -1 3 8 -6 7 6 09 -5 4-2 9 4 -2 9 4 -2 9 4 -2 9 -1 3 8 -1 3 8 -1...

2018-05-05 22:39:20 1103

原创 动态规划解决01背包问题

0-1背包(动态规划) 问题描述:给定n种物品和一背包。物品i的重量是wi,其价值是vi,背包的容量为c。 问应如何选择装入背包的物品,使得装入背包中物品的总价值最大?问题分析:对于一种问题,要么装入背包,要么不装。所以对于一种物品的装入状态可以取0和1。eg:物品个数n=5,物品重量w[n]={0,2,2,6,5,4},物品价值V[n] = {0,6,3,5,4,6},总重量c=10. (第0

2018-05-05 22:26:36 223

原创 I/O复用--select函数源码剖析

一、select进入内核态之后就调用sys_select()//n表示调用时的参数表中一共有多少个位图,即需要监听的文件描述符最大值,一般为最大值加1//fd_set表示已打开文件的位图,位图的每一位都代表着当前进程的一个已打开文件,根据其结构定义得知,select最多可以监听1024个文件描述符//tvp表示睡眠等待的最长时间,如果为0则表示立即返回,如果为NULL则表示阻塞等待,直到所监听的

2017-11-05 16:14:26 309

原创 剑指offer--实现power函数

面试题11:数值的整数次方 题目:实现函数double Power(double base,int exponent),求base的exponent次方。不得使用库函数,同时不需要考虑大数问题。理解:考虑指数是整数,负数两种情况 当指数为负数时,先对指数求绝对值,再算出次方的结果取倒数。 求倒数的时候,不能对0取倒数,所以底数不能为0//判断是否和0相等bool equal(double n

2017-10-29 22:08:19 393

原创 删除字符串中的空格

1、删除字符串中所有的空格char *DelBlankFromStr(char *str){ if(str != NULL) { char *p = str; int i = 0; while(*p != ' ') {++p;}//删除前面的空格 while(*p!='\0') {

2017-10-26 21:12:25 3833

原创 map中[]运算符和find的区别

map的下标运算符[]的作用是:将关键码作为下标去执行查找,并返回对应的值;如果不存在这个关键码,就将一个具有该关键码和值类型的默认值的项插入这个map。map<string,string> m;m["first"] = "hello";m["second"] = "world";cout<<"[]查找之前"<<endl;map<string,string>::iterator it = m.

2017-10-22 23:24:13 13158

原创 vector扩容

vector向量容器相当于一个动态的数组,当向向量容器中不断加入元素,若超过容器本身的大小限制,vector会自动拓展大小,在这过程中涉及到内存的分配和回收。在veector中有size()和capacity()函数。size()函数是指返回当前容器中的元素个数,对应的resize(size_type)会在容器尾添加或删除一些元素,来调整容器中实际的内容,使容器达到指定的大小。capacity()指

2017-10-19 22:29:21 835

原创 STL空间配置器

一、为什么要产生空间配置器 在软件开发,程序设计中,我们不免因为程序需求,使用很多的小块内存(基本类型以及小内存的自定义类型)容易出现以下问题: 1、出现内存碎片问题(外部碎片) 2、一直在因为小块内存而进行内存申请,调用malloc,系统调用产生性能问题。考虑到小型区块所可能造成的内存破碎问题,就有了双层级配置器。 二、空间配置器1、调用:当配置区是否超过128bytes? yes:调用

2017-10-16 20:49:40 170

原创 STL六大组件

一、什么是STL 1、STL(Standard Template Library),即标准模板库,是一个高效的C++程序库。 2、包含了诸多在计算机科学领域里常用的基本数据结构和基本算法。为广大C++程序员们提供了一个可扩展的应用框架,高度体现了软件的可复用性3、从逻辑层次来看,在STL中体现了泛型化程序设计的思想(generic programming)在这种思想里,大部分基本算法被抽象,被泛

2017-10-16 15:23:38 293

转载 内存池的实现

引言C/C++下内存管理是让几乎每一个程序员头疼的问题,分配足够的内存、追踪内存的分配、在不需要的时候释放内存——这个任务相当复杂。而直接使用系统调用malloc/free、new/delete进行内存分配和释放,有以下弊端: 1.调用malloc/new,系统需要根据“最先匹配”、“最优匹配”或其他算法在内存空闲块表中查找一块空闲内存,调用free/delete,系统可能需要合并空闲内存块,这些

2017-10-15 19:26:07 321

原创 实现内存分配器

两种内存分配方法:边界标识法和伙伴系统 1、边界标识法 比较灵活,但回收不方便boundary.h#pragma oncetypedef struct WORD{ union { struct WORD *llink; struct WORD *uplink; }; int tag;//0空闲1占用 int size;

2017-10-15 19:14:25 399

原创 剑指offer--栈的压入、弹出序列

面试题22:栈的压入、弹出序列 题目:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1、2、3、4、5是某栈的压栈序列,序列4、5、3、2、1是该栈序列对应的一个弹出序列,但4、3、5、1、2就不可能是该压栈序列的弹出序列。思路:按照题目中的例子,序列1为1、2、3、4、5,序列2为4、5、3、2、1。定义一个辅助栈,按照

2017-10-15 13:00:00 146

原创 剑指offer--包含min函数的栈

面试题21:包含min函数的栈 题目:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数。在该栈中,调用min,push及pop的时间复杂度都是O(1).思路:每次把最小的值都保存在辅助栈里。//包含min函数的栈template <typename Type>class StackWithMin{public: void pop(); void pus

2017-10-15 12:09:55 126

原创 剑指offer--顺时针打印矩阵

面试题20:顺时针打印矩阵 题目:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。 例如:如果输入以下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则一次打印出数字:1、2、3、4、8、12、16、15、14、13、9、5、6、7、11、10.#define ROW 4#define COL 4//一次打印一圈vo

2017-10-14 21:22:30 144

原创 链表有环相关问题

1、如何判断一个链表是否有环? 2、如果有环的话,如何计算环的长度? 3、如何找到环的入口? 4、找到两条链表的第一个交点1、现在先来解决第一个问题: 可以设置两个指针fast和slow都指向链表头,fast指针每次向前走两步,slow指针每次向前走一步。 如果fast指针遇到NULL了,说明该链表没有环。 如果链表有环,fasr指针每次都比slow指针走的快,最终两个指针会相遇。boo

2017-10-14 17:01:20 164

原创 剑指offer--树的子结构

面试题18:树的子结构 题目:输入两棵二叉树A和B,判断B是不是A的子结构。二叉树结点的定义如下: struct BinaryTreeNode { int m_nValue; BinaryTreeNode *m_pleft; BinaryTreeNode *m_pright; };BinaryTreeNode* BuyNode()//申请一个节点{ B

2017-10-14 14:19:28 158

原创 剑指offer--二进制中1的个数

面试题10:二进制中1的个数 题目:请实现一个函数,输入一个整数,输出该数二进制表示中1的个数。例如把9表示成二进制是1001,有2位是1.因此如果输入9,该函数输出2.1、最简单的做法//得到二进制1的个数int NumberOf1(int n){ int count = 0; while(n) { if(n%2 != 0) c

2017-10-14 11:06:16 181

原创 剑指offer--合并两个排序的链表

面试题17:合并两个排序的链表 题目:输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然使按照递增排序的。例如: 链表1: 1->3->5->7 链表2:2->4->6->8 链表3:1->2->3->4->5->6->7->8struct ListNode{ int m_nKey; ListNode *m_pNext;};void Show(ListNode

2017-10-13 23:12:56 133

原创 剑指offer--链表逆置

面试题16:反转链表 题目:定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点。结点定义如下: struct ListNode { int m_nKey; ListNode *m_pNext; };void Show(ListNode *head){ for(ListNode *p=head;p!=NULL;p=p->m_pNext)

2017-10-13 20:35:26 229

原创 剑指offer--链表中倒数第k个结点

面试题15:链表中倒数第k个结点 题目:输入一个链表,输出该链表中倒数第k个结点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾结点是倒数第1个结点。例如一个链表有6个结点,从头结点开始它们的值依次是1、2、3、4、5、6。这个链表的倒数第3个结点是值为4的结点。struct ListNode{ int m_nKey; ListNode *m_pNext;};ListNo

2017-10-13 19:25:10 120

原创 剑指offer--调整数组顺序使奇数位于偶数前面

面试题14:调整数组顺序使奇数位于偶数前面 题目:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。void ReorferOddEven(int *arr,int n){ if(arr==NULL || n<=0) return; int i = 0; int j = n-1; wh

2017-10-13 17:05:00 164

原创 在excel2003中,用A表示第一列,B表示第二列....Z表示第26列,AA表示27列,AB表示28列。

在excel2003中,用A表示第一列,B表示第二列….Z表示第26列,AA表示27列,AB表示28列。1、输入用字母表示的列号编号,输出它是第几列 —->把26进制转成10进制 //把26进制转成10进制int index(char *str,char x){ int i = 0; for(;i<strlen(str);i++) { if(str[i]

2017-10-13 16:33:14 9649 2

原创 剑指offer--用O(1)的时间复杂度删除链表的节点

给定单项链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点。//不带头结点的单链表struct ListNode{ int m_nKey; ListNode *m_pNext;};//尾插void InsertTail(ListNode **head,int key){ ListNode *newnode = new ListNode(); n

2017-10-13 15:36:37 243

原创 fork(),vfork(),clone()的区别

一、fork() 1、fork()调用一次返回两次 返回值:成功(父进程:返回子进程的PID,子进程:返回0); 失败(父进程返回-1) fork创建一个进程时,子进程只是完全复制父进程的资源,复制出来的子进程有自己的task_struct结构和pid,但却复制父进程其它所有的资源。例如,要是父进程打开了五个文件,那么子进程也有五个打开的文件,而且这些文件的当前读写指针也停在相同的地方。这样

2017-10-13 14:18:24 392

翻译 fork()源码

调用fork()函数执行到了unistd.h中的宏函数syscall0 1 /* XXX - _foo needs to be __foo, while __NR_bar could be _NR_bar. */ 2 /* 3 * Don't remove the .ifnc tests; they are an insurance against 4 * any hard-to-spot

2017-10-12 23:10:10 407

原创 系统调用

一、系统调用                                                 Unix/Linux体系架构如上图所示,从宏观上来看,Linux操作系统的体系架构分为用户态和内核态(或者用户空间和内核)。内核从本质上看是一种软件——控制计算机的硬件资源,并提供上层应用程序运行的环境。用户态即上层应用程序的活动空间,应用程序的执行必须依托于内核提供的

2017-10-12 19:49:20 302

原创 Linux下如何在进程中获取虚拟地址对应的物理地址

linux的/proc目录下记录了进程内存信息的映射,称其为虚拟目录。在/proc目录下有一个链接目录名为self,哪一个进程打开了它,它存储的信息就是该进程的。self中有一个pagemap文件,用来记录所链接进程的物理页号信息。pagemap是linux中一组新的接口集合,他通过读取/proc中的文件允许用户态的程序检查页表以及相关的信息。 /proc/pid/pagemap:这个文件允许一个

2017-10-11 12:26:48 3001 2

转载 Linux下的虚拟地址映射详解(二)线性地址到物理地址的映射

现在有这么一个函数 void main(){int a = 2;cout while(a){;}cout}     函数运行起来会是这个样子:先打印出a的地址,假设是0x12345678,接着会进入死循环。现在如果要求你寻找某个办法,来跳出循环打印”fun end”,然后结束整个函数

2017-10-10 22:41:33 602

转载 Linux下的虚拟地址映射详解(一)逻辑地址到线性地址的映射

原文:点击打开链接现在假设有这么一段代码: void main(){int a = 100;cout} 如果编译执行,先打印地址,假设是0x12345678。那么,这个地址,是逻辑地址呢,还是线性地址,亦或是物理地址呢?     首先我们需要引入一些别的东西。在英特尔的X86体系下,从他的发展可以看出他是从实模

2017-10-10 22:36:45 459

转载 实模式和保护模式区别及寻址方式

实模式和保护模式区别及寻址方式出处:http://blog.csdn.net/rosetta64KB-4GB-64TB?    我记得大学的汇编课程、组成原理课里老师讲过实模式和保护模式的区别,在很多书本上也有谈及,无奈本人理解和感悟能力实在太差,在很长一段时间里都没真正的明白它们的内含,更别说为什么实模式下最大寻址空间为1MB?段的最大长度不超过64KB?而保护模式下为啥最大寻址

2017-10-10 19:50:31 585

空空如也

空空如也

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

TA关注的人

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