- 博客(59)
- 问答 (1)
- 收藏
- 关注
原创 vue项目使用xlsx-style导出自定义格式excel
一.遇到问题1.给自定义格式的excel中的合并单元格加边框的时候,出现边框不完整的情况. 解决:将该合并单元格拆分成最小单位的单元格,设置其边框属性. 直接赋值的话不可行,因为子单元格并没有边框属性,只有合并单元格才有, 这里使用的方法是:记录合并单元格的属性信息, 然后循环对子单元格赋值. 代码:function addRangeBorder(range,ws){ let arr...
2020-02-22 21:27:25
7096
2
原创 动态规划
做了一些动态规划的题目, 总结了一下思路和分析过程.在此分享一.分析方法:动态规划的关键在于如何把一个问题分解成子问题, 分解完问题就可以得出关系式, 得出关系式就可以编码了. 以下是我分解问题的思路:1.确定分析纬度: 只有一个参考因素的话只需要一维数组记录数据, 比如最长递增序列, 只有自己一个序列在比较; 比如最长子序列,涉及到两个序列, 因为其下标的变化不是同步的, 所以需要...
2020-02-15 17:47:37
196
转载 epoll详解
什么是epollepoll是什么?按照man手册的说法:是为处理大批量句柄而作了改进的poll。当然,这不是2.6内核才有的,它是在2.5.44内核中被引进的(epoll(4) is a new API introduced in Linux kernel 2.5.44),它几乎具备了之前所说的一切优点,被公认为Linux2.6下性能最好的多路I/O就绪通知方法。 ep
2016-09-25 21:48:12
403
原创 ARP协议解析
一、ARP协议简介在实际应用中,我们会遇到这样的问题:知道一个机器的IP地址,却不知道其物理地址。ARP协议就是用来解决这样的问题的。由于IP协议使用了ARP协议,所以把ARP协议归于网络层,但ARP的作用是从网络层使用的IP地址解析出数据链路层使用的物理地址,因此把其归于数据链路层也是可以的。二、ARP协议的工作原理每个主机都设有一个ARP高速缓存,里面存的是本局域网上各
2016-09-19 15:37:43
875
原创 单例模式
单例模式是一种常用的软件设计模式。特点: 线程安全并且高效单例类保证全局只有一个实例对象单例类提供唯一一个实例接口代码:1、懒汉模式class singleton{ static singleton*Getinstance()//没有构造函数,只能用类名直接调用 { if (NULL == _sinstance)//双重判断,使代码更高效 {//l
2016-09-14 19:06:38
329
原创 大数据处理算法--Bloom Filter
一、布隆过滤器(Bloom Filter)的定义布隆过滤器可以用来检测数据是否存在于一个集合中。它是hash的扩展,底层就是一个位数组,每一个bit位可以表示一个数字,所以布隆过滤器是基于位图来实现的。二、布隆过滤器的原理1、插入数据在位图中,每一个bit对应一个数字,出现一个数字就可以在相应的位上置1。但是布隆过滤器不一样,它要处理的不仅仅是整型还有其他如string类型
2016-09-06 21:45:32
568
原创 快排详解
一、快排的三种方法1、最早的方法 (1)思路:给出一个key值(默认为数组第一个位置上的数),从数组开头开始找大于key的数,数组末端开始找小于key的数,找到之后两位置上的数进行交换 (2)画图理解: (3)代码:int Partition2(int*arr, int left, int right){ int key = arr[left]; while (left
2016-09-06 15:02:04
4067
转载 红黑树和AVL树的效率对比
为什么选择红黑树作为底层实现 红黑树是一种类平衡树, 但它不是高度的平衡树, 但平衡的效果已经很好了. 补充说明另一种 AVL 树, 我之前的博文: 《编程珠玑,字字珠玑》读书笔记完结篇——AVL树用过 STL map 么, 你用过 linux 么(这个说大了), 他们都有红黑树的应用. 当你对搜索的效率要求较高,并且数据经常改动的情景,你可以用红黑树, 也就是 map.至于, 为什么不用 AVL
2016-09-05 20:08:47
4963
1
原创 大数据处理
一、面试题:.给40亿个不重复的无符号整数,没排过序。给一个无符号整数,如何快速判断一个数是否在这40亿个数中。思路:40亿的数据如果加载到内存中去需要16G的空间,显然不可能实现。这时候如果用一个比特位表示一个数字,那么需要的空间就只要16G/32(一个整型数据有32个比特位),即500多M,这时计算起来就比较方便了。(位图)实现方法: (1)、开辟一段连续足以存下所有整型数据的整型空间 (2
2016-09-04 17:33:22
346
原创 哈希表解析
一、何为哈希表HashTable-散列表/哈希表,是根据关键字(key)来直接访问在内存存储位置的数据结构。 它通过一个关键值的函数将所需的数据映射到表中的位置来访问数据,这个映射函数叫做散列函数,存放记录的数组叫做散列表。二、哈希表的构造方法直接定址法–取关键字的某个线性函数为散列地址,Hash(Key)= Key 或 Hash(Key)= A*Key + B,A、B为常数。除留余数法–取关
2016-09-04 16:16:40
472
原创 IPC主题三之共享内存
一、共享内存的定义共享内存就是几个进程能访问到物理地址上的同一块空间,从而实现进程间通信。共享内存是不具备同步和互斥机制的。二、函数解析(1)int shmget( key_t key, size_t size, int flag ); 作用:创建或打开一块共享内存区参数: 第一个参数key:用来变换成一个标识符,而且每一个IPC对象与一个key相对应。 第二个参数size:当新建一个共享内存
2016-09-02 20:06:52
248
原创 IPC主题二之信号量
一、信号量的定义为了防止出现因多个程序同时访问一个共享资源而引发的一系列问题,我们需要一种方法,它可以通过生成并使用令牌来授权,在任一时刻只能有一个执行线程访问代码的临界区域。临界区域是指执行数据更新的代码需要独占式地执行。而信号量就可以提供这样的一种访问机制,让一个临界区同一时间只有一个线程在访问它,也就是说信号量是用来调协进程对共享资源的访问的。信号量是一个特殊的变量,程序对其访问都是原子操作(
2016-09-02 17:47:14
317
原创 IPC主题一之消息队列
一、消息队列的定义消息队列是消息传输过程中保存消息的容器,就是一个消息的链表。可以把消息看作一个记录,具有特定的格式以及特定的优先级。对消息队列有写权限的进程可以向消息队列中按照一定的规则添加新消息;对消息队列有读权限的进程则可以从消息队列中读走消息。二消息队列的特点1、消息队列应用于进程间的通信 2、消息队列是面向数据块的,进程间传输的是有类型(用于区分数据类型)的数据块。 3、每个消息队列的
2016-09-01 20:54:56
319
原创 解析linux中的文件描述符
一、文件描述符简介 文件描述符在形式上是一个非负整数。实际上,它是一个索引值,指向内核为每一个进程所维护的该进程打开文件的记录表。当程序打开一个现有文件或者创建一个新文件时,内核向进程返回一个文件描述符。在程序设计中,一些涉及底层的程序编写往往会围绕着文件描述符展开。习惯上,标准输入的文件描述符是 0,标准输出是 1,标准错误是 2。 画图表示 二、如何创建文件描述符 进程获取文件描述符最常
2016-08-27 17:37:44
838
1
原创 linux缓冲区解析
1.什么是缓冲区缓冲区是内存的一部分空间,用缓冲输入输出的数据。缓冲区又分为输入缓冲区和输出缓冲区。缓冲区又被称为缓存.2.缓冲区存在的意义主要的意义就是为了提高cpu的效率。 输入端。假如没有缓冲区,我们要从磁盘中读取数据,有几个字符,CPU就要读写几次,CPU是高速率的,而读取是低速率的,这样做会降低CPU的效率。相反如果将数据都存在缓冲区里面,等要读取的时候就可以一次性读取多数的数据。大大地
2016-08-27 15:37:23
5309
1
转载 文件的粘滞位
文件的粘滞位(sticky)位是作什么用的? 普通文件的sticky位会被linux内核忽略, 目录的sticky位表示这个目录里的文件只能被owner和root删除 粘着位(Sticky bit) 如果用户对目录有写权限,则可以删除其中的文件和子目录,即使该用户不是这些文件的所有者,而且也没有读或写许可。 粘着位出现执行许可的位置上,用t表示,设置了该位后,其它用户就不可以删除不属于他的
2016-08-26 20:56:25
572
原创 实际用户和有效用户
每个进程都有非负的整型表示唯一的进程ID。 下面三个是常见的ID: 0 是交换进程,属于系统进程,是内核的一部分,不执行磁盘上的程序,是调度进程 1 是用户进程,永远不会停止,会启动系统,读取系统初始化文件 2 是精灵进程,属于系统进程,虚存系统的请页操作除了进程ID,每个进程还有其他的符号: pid:进程ID ppid:父进程ID uid:实际用户ID(在root下就是0,普通用户下
2016-08-26 20:08:12
3771
原创 linux进程内存映象解析
一、程序如何转化为进程程序转化为进程一般有两个步骤: 1、内核会将程序从磁盘读入内存,为程序分配内存空间 2、内核会为进程保存PID以及相应的状态信息(保存在task_struct中),将进程放在运行队列中等待执行。 程序转变为进程以后就可以被操作系统调度程序执行了。二、内存映象内存映象指的是内核如何在内存中存放可执行程序。 在程序转化为进程的过程中,操作系统可直接将可执行程序复制到内存中,
2016-08-25 20:16:13
4544
原创 文件的时间参数和find命令解析
一、时间参数stat命令可以获取文件的三个时间,如下图所示,他们分别是Access,Modify和Change,那么他们分别代表什么意思呢? access time:表示我们最后一次访问(仅仅是访问,没有改动)文件的时间 modify time:表示我们最后一次修改文件的时间 change time:表示我们最后一次对文件属性改变的时间,包括权限,大小,属性等。而且这三个时间有如下的特点:
2016-08-23 22:36:46
956
原创 栈面试题总结
1.求栈上的最小值具体要求:在O(1)的时间复杂度内求出栈上的最小值,并且不受出栈入栈的影响。 思路:借助一个辅助栈,原栈在有数据入栈的时候,辅助栈也有数据入栈。辅助栈入栈的数据为当前的最小值。 实现:template<typename T>class StackMin{public: void Push(const T&data); void Pop(); T M
2016-08-23 11:13:55
304
原创 数据结构之红黑树解析
红黑树1.定义:红黑树是一棵二叉搜索树,它在每个节点上增加了一个存储位来表示节点的颜色,可以是Red或Black。通过对任何一条从根到叶子简单路径上的颜色来约束,红黑树保证最长路径不超过最短路径的两倍,因而近似于平衡。2.特性:(1)每个节点,不是红色就是黑色的(2)根节点必须为黑色(3)不能出现连续的红节点(4)对每个节点,从该节点到所有叶节点上的黑色节点的和相当
2016-08-20 16:38:08
378
原创 AVL树解析
首先介绍一下AVL旋转树:AVL树也是一棵二叉搜索树,AVL树存在的原因是避免二叉搜索树因为左右子树高度相差过大使得查找花费过多时间。下面就来介绍一下AVL树的实现,这里重点介绍AVL中的Insert接口,因为这个结构就包含了AVL的所有精华。1、插入节点 要插入一个节点就必须先找到节点要插入的位置,因为AVL树同时也是一棵平衡树,所以用循环或递归很容易就可以找到。插入时要注意是插
2016-08-18 23:19:57
422
原创 模拟实现智能指针
众所周知,智能指针是用来管理指针的,为了避免开辟了空间而忘记释放的情况。 下面我们分别来模拟实现以下boost库中三种智能指针的实现,他们分别是auto ptr,scoped ptr,shared ptr。一.auto ptr旧版本的实现:template <typename T>class Auto_ptr{public: Auto_ptr(T*ptr = NULL) :_pt
2016-08-16 23:58:12
421
原创 深度探索c++对象模型
所谓知己知彼,百战不殆。只有深入了解了c++对象的内存布局,我们才能更熟练运用c++这门语言。 运行环境vs2013一单继承和多继承的结合class C{public: C() :c(1){}private: int c;};class B1 :public C{public: B1() :C(), b1(2){}private: int b1;}
2016-06-16 17:40:53
793
原创 探索友元的继承和传递问题
书上说,友元类是单向的,不可继承,不可传递,为了验证它,我完成了以下的测试环境:vs2013一.友元类继承1.A是B的友元类,A的public派生类能访问B的私有成员和保护成员吗?不可以!请看下面代码:class A;class B{public: friend class A;protected: int b1;private: int b2;};
2016-06-15 11:29:53
1070
原创 c++再回首之继承
继承乃c++三大特性之一,可见其重要性,所以今天特意将学习的知识拿出来好好总结了一下:如果发现本文中有错误,麻烦指明,谢谢! 一.继承概念继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能。这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。
2016-06-15 08:26:42
250
原创 虚表剖析
首先介绍一下虚表:在C++语言中,每个有虚函数的类或者虚继承的子类,编译器都会为它生成一个虚拟函数表(简称:虚表),表中的每一个元素都指向一个虚函数的地址。(注意:虚表是从属于类的)一.虚表的存在形式class Base{public: virtual void fun1() { cout << "Base::fun1()" << endl; }
2016-06-11 22:34:34
526
原创 约瑟夫环的实现
首先介绍一下约瑟夫环: 约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3…n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。通常解决这类问题时我们把编号从0~n-1,最后[1] 结果+1即为原问题的解。在这里用数组实现以下约瑟夫环,请看题: 有n只猴子
2016-06-10 13:23:50
480
原创 大小端存储
今天做到一道关于存储的题,顺便回顾一下大小端:union X{ int32_t a; struct { int16_t b; int16_t c; };};int main(){ X x; x.a=0x20150810; printf("%x,%x\n",x.b,x.c); return 0;}
2016-06-08 10:24:14
468
转载 深入了解c++的动态绑定和静态绑定
为了支持c++的多态性,才用了动态绑定和静态绑定。理解他们的区别有助于更好的理解多态性,以及在编程的过程中避免犯错误。 需要理解四个名词: 1、对象的静态类型:对象在声明时采用的类型。是在编译期确定的。 2、对象的动态类型:目前所指对象的类型。是在运行期决定的。对象的动态类型可以更改,但是静态类型无法更改。 关于对象的静态类型和动态类型,看一个示例:class B { } cla
2016-06-05 15:48:52
253
原创 string类的实现
string类有两种实现方式:一:class String{public: String(char*pt = "")//使用缺省构造参数以满足无参对象和有参对象 { if (NULL == pt) { p = new char[1]; *p = '\0'; } else
2016-06-04 21:41:01
493
原创 c++中的常量折叠
何谓常量折叠? 常量折叠就是将常量表达式计算求值,并用求得的值来替换表达式,放入常量表。可以算作一种编译优化。(预编译阶段)接下来我们通过一段代码来分析一下了解一下常量折叠及其特性:int main(){ const int a = 10; int b = 2*a; int c = b; int *p = (int*)&a; *p = 100; c
2016-06-03 14:21:46
1140
原创 成员函数的重载,覆盖与隐藏
成员函数的重载,覆盖和隐藏是三个很容易混淆的概念,下面我们来区分一下这三者一 重载的特点 1 两个函数处于同一作用域中(即同一个类中) 2 函数名要相同 3 参数不相同(参数的个数,参数的类型,参数的顺序) 4 返回值可同可不同 5 virtual关键字可有可无二 覆盖的特点 1 两个在不同作用域中(基类与派生类) 2 函数名相同 3 参数相同 4 基类必须要有virtual关键字
2016-06-03 13:01:50
276
原创 malloc和new的十一个区别
一 属性 1 new/delete是c++操作符 2 malloc/free是c/c++标准的库函数二 申请内存所在位置 1 new:自由存储区:自由存储区是c++基于new操作符的一个抽象概念。通过new申请的内存都称为自由存储区,自由存储区可以为堆,也可以为静态存储区(取决于operator new()在哪里为对象分配内存)。 2 malloc:堆:堆是操作系统的术语,是系统维护的
2016-06-03 09:36:14
253
转载 vim之代码折叠
手动折叠:zfap你将会看到该段落被一行高亮的文本所代替。你已经创建了一个折叠了。|zf|是一个操作符,而|ap|是一个文本对象。你可以将|zf| 操作符跟任何一个移动命令联用,为所经 之处的文本创建一个折叠。|zf| 也能在可视模式下使用说明:ap是用以选择一个段落。这里a的用法如下所示: " "this is a example" "使用的方法就是a只要在内层双引号
2016-06-02 20:11:57
994
转载 inline详解
本文介绍了GCC和C99标准中inline使用上的不同之处。inline属性在使用的时候,要注意以下两点:inline关键字在GCC参考文档中仅有对其使用在函数定义(Definition)上的描述,而没有提到其是否能用于函数声明(Declare)。从 inline的作用来看,其放置于函数声明中应当也是毫无作用的:inline只会影响函数在translation unit(可以简单理解为C源码文件)内
2016-06-02 09:30:52
473
原创 宏和内联的比较
c++中强制建议用const替代宏常量,用内联函数替代宏函数,这是为何?一.宏 首先我们来看下宏的优缺点: 优点:增强代码的复用性,提高性能 缺点:不方便调试(因为在预编译阶段就进行了替换) 可读性差,可维护性差,容易误用。 没有类型安全的检测。例:#define ADD( a, b ) a + bvoid Test (){ int a = 2; int b = 3
2016-06-01 17:07:04
263
转载 vs中debug和relsese版本的区别
vs中的程序有debug和release两个版本,Debug通常称为调试版本,通过一系列编译选项的配合,编译的结果通常包含调试信息,而且不做任何优化,以为开发 人员提供强大的应用程序调试能力。而Release通常称为发布版本,是为用户使用的,一般客户不允许在发布版本上进行调试。所以不保存调试信 息,同时,它往往进行了各种优化,以期达到代码最小和速度最优。为用户的使用提供便利。 debug程序通常
2016-06-01 15:52:20
1919
原创 整型提升
K&R C中定义整型提升: 1. 只要一个表达式中用到了整型值,那么类型为char、short int活整型位域(这几者带符号或无符号均可)的变量,以及枚举类型的对象,都可以被放在这个整型变量的位置。 2. 如果1)中的变量的原始类型值域可以被int表示,那么原值被转换为int;否则的话,转为unsigned int。这段话理解起来是不是有点困难,我们来举个例子理解起来就简单了 char
2016-06-01 15:01:49
1351
空空如也
虚继承中对象空间的几个值得作用
2016-06-12
TA创建的收藏夹 TA关注的收藏夹
TA关注的人