- 博客(83)
- 收藏
- 关注
原创 epoll底层红黑树使用部分源码剖析:为什么使用红黑树以及如何使用红黑树
我们知道epoll的底层使用了红黑树来管理文件描述符,为什么会选择红黑树这种结构呢?以下是个人理解:epoll和poll的一个很大的区别在于,poll每次调用时都会存在一个将pollfd结构体数组中的每个结构体元素从用户态向内核态中的一个链表节点拷贝的过程,而内核中的这个链表并不会一直保存,当poll运行一次就会重新执行一次上述的拷贝过程,这说明一个问题:poll并不会在内核中为要监听的文...
2019-08-19 18:26:30 11940 1
原创 C++模板:函数模板
函数模板: 函数模板: 我们看这段代码,compare是一个函数名还是一个模板名?其实他是一个模板名。如果要把他看成一函数来使用,就要用一个类型来实例化这个模板,在使用时可以给其后尖括号中加上要使用的类型名,如下:用int类型给模板传参的过程叫做模板的实例化模板的实例化(显式实例化 隐式实例化):上面讲到的那些实例化都是隐式的实例化,...
2018-09-10 23:40:52 17782 2
原创 C和C++的区别
带有默认值的函数C89标准中,c语言没有带有默认值的参数,c99之后才有给函数默认值既可以在定义处,也可以在声明处,但只能给一次默认值第一次声明时给最右边的参数一个默认值,第二次声明时给左边参数一个默认值也是合法的(vs2008中合法,但是vs2017中是非法的)赋默认值必须从右向左依次赋值,在调用时,如果没有给实参,则把参数默认值压栈,也可以只传没有默认值的那个参数。使...
2018-07-27 23:32:31 8093
原创 SwiftUI入门
摘要这篇分享的内容是关于SwiftUI的一些知识,主要分为以下几个方面:SwiftUI的概念和用法;WWDC 20大会上对swiftUI的更新介绍;SwiftUI在开发应用中的优缺点分析以及它和我们目前开发中使用的UIKit的比较;SwiftUI的发展前景等。前景从以下数据可以看出,未来swift将是iOS开发的唯一选择,越早进行相关的迁移工作会对未来公司的发展越有利:从 WWDC17 后 苹果已经不再使用 Objective-C 做 Sample Code 演示 https://deve
2020-09-04 01:53:59 2336
原创 UINavigationController的几个小问题
1.navigationController、navigationBar和navigationItem三者之间的关系navigationController和navigationBar之间的关系相当于viewController和view之前的关系,一个是导航栏控制器和导航栏,另一个是视图控制器和视图。虽然在开发中经常使用navigationController中的navigationBar来设置导航栏,但是navigationBar也是一个独立的UI控件,可以不依赖navigationControll
2020-06-16 11:46:50 491
原创 UITableView使用中常见的问题
在介绍UITableView使用中常见的问题之前,我们先简单介绍一下UITableView的相关概念。UITableView是UIKit框架库中的一个很重要的类,它被用来实现竖向排列的表格,例如微信中的消息列表和好友列表等;也被用来实现feed流,例如微博中的动态。UITableView的Delegate和DataSource要想使用UItableView,那么数据源和代理是不可或缺的。数据源顾名思义就是为tableView提供数据的对象,它负责告诉UItableVIew对象有几个section,每
2020-06-14 17:44:47 779
原创 ios编程--1.视图与视图层次结构
视图基础视图是UIView对象,或者是UIView的子类对象 视图知道如何绘制自己 视图可以处理触摸事件 视图会按照层次排列,位于视图层次最顶端的是应用窗口(UIWindow对象) 视图的层次结构任何一个应用都有且只有一个UIWindow对象,也就是应用窗口,是所有视图的容器。应用需要在启动时创建并设置UIWindow对象,然后为其添加其他视图。加入窗口的视图会成为该窗口的...
2020-06-09 10:18:54 323
原创 删除链表的节点----剑指offer第18题
题目描述在O(1)时间复杂度内删除链表节点。给定单向链表的头指针和一个节点指针,定义一个函数在O(1)时间内删除该节点。链表节点与函数的定义如下:typedef struct Node{ int val; Node* next;}Node;解题思路由于单链表的限制,如果要删除一个节点必须得到它的prev节点,这样的时间复杂度只能是O(n)。但我们有另外一种方法,我们可以...
2019-09-23 14:20:28 301
原创 两个队列实现一个栈----剑指offer扩展
题目描述使用两个队列实现一个栈。实现push和pop函数。解题思路利用队列先进先出的特性,我们可以使用两个队列来模拟栈的特性。当我们往栈中push元素时,往非空的那个队列中push;当我们pop栈中的元素时,将非空的队列中的元素取出来再push到本来为空的队列中,直到剩下一个元素时,将该元素front出来。代码实现#include <iostream>#incl...
2019-09-23 13:22:40 205
原创 打印从1到最大的n位数----剑指offer第17题
题目描述输入数字n,按顺序打印从1开始到最大的n位十进制数,例如当n = 3,就输出从1~999.解题思路可能大家会想这么简单的题用一个for循环输出不就好了吗,其实这是最基本的情况。如果n为100呢?整型数据存不下的时候怎么做?其实这里还是涉及到一个大数的加法问题。我们使用一个vector,其中的每一位存放整数中的一位,从最低位到最高位,输出的时候从高到低输出。代码实现#i...
2019-09-17 19:52:01 190
原创 自己实现power函数----剑指offer第十六题
题目描述实现函数 double Power(double base, int exponent),求base的exponent次方,不得使用库函数,同时不需要考虑大数问题。解题思路如果我们要求的exponent是32,而且此时我们已经知道了它的16次方,那么只需要给其16次方求一次平方即可,而16次方是8次方的平方,以此类推,我们求32次方时只需要做5次乘法:先求平方,在平方的基础上求...
2019-09-16 20:35:06 320
原创 二进制中1的个数----剑指offer第十五题
题目描述请实现一个函数,输入一个整数,输出该整数二进制表示中1的个数。解题思路当一个数n和n-1做位与运算的结果不为0的时候,说明该数的二进制表示中存在1,而且位与的结果中1的个数会比n中1的个数刚好减少一个。我们可以根据这个方法来对齐进行位与,直到位与的结果为0,再输出循环的次数。代码实现int judge(int number){ int count = 0; ...
2019-09-16 19:23:41 166
原创 两个栈实现一个队列----剑指offer第七题
题目描述用两个栈实现一个队列。队列的声明如下,请实现它的两个函数appendTail和deleteHead,分别完成在队列尾部插入节点和在队列头部删除节点的功能。解题思路我们定义两个栈stack1和stack2,stack1用来插入元素,当要删除元素时,首先将stack1中的所有元素全部push到stack2中,这样stack1栈顶的元素就到了stack2栈底,stack1栈底的元素就...
2019-09-15 18:37:23 135
原创 重建二叉树----剑指offer第六题
题目描述输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。节点的定义如下typedef struct Node{ char val; Node* lc; Node* rc; Node(char x) :val(x) { lc = NULL; rc = NULL; }}Node;解题思路在二叉树的前序遍历中,第...
2019-09-15 15:40:20 163
原创 从尾到头打印链表----剑指offer第五题
题目描述输入一个链表的头节点,从尾到头打印出链表的每个节点的val。解题思路我们知道单链表只能从前往后遍历,那从最后一个元素开始打印节点的val值必须要先遍历之前的每个节点,也就是先遍历的后输出。想到这里不难想到我们要用到的结构是栈了吧,由于栈的特性就是先进后出。把之前遍历过的每个节点的值都保存在栈里,遍历完之后栈顶元素就是单链表的最后一个元素,然后我们依次输出栈中元素即可。代码实...
2019-09-15 12:18:21 166
原创 替换字符串----剑指offer第四题
题目描述请实现一个函数,把字符串中的每个空格替换成“%20”,例如,输入“we are happy.”,则输出“we%20are%20happy.”.解题思路利用c++的string类型中的insert方法,进行遍历,如果当前下标的字符是空格,那么把它替换成%,再使用insert方法插入20.实现代码#include<iostream>#include<s...
2019-09-13 11:07:21 158
原创 二维数组中的查找----剑指offer第三题
题目描述在一个二维数组中,每一行都按照从左往右递增,每一列都按照从上往下递增。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。解题思路按照该二维数组的特性,我们可以从第一行的最后一个元素开始查找,当该元素小于目标元素时,我们就可以直接忽略这一整行的其他元素进入下一行,当该元素大于目标元素时,我们可以直接忽略这一列,向左递减一列。然后重复这个过程,直到找完这整...
2019-09-12 19:50:25 155
原创 数组中重复的数字----剑指offer第二题
题目描述在一个长度为n的数组里的所有数字都在0~n-1的范围内。数组中某些数字是重复的,但不知道有几个数字重复,也不知道每个数字重复了几次,请找出任意一个重复的数字。例如,数组是[2,3,1,0,2,5,3],那么重复的数字可以是2或者3.解题思路在原数组里从头到尾进行扫描,当扫描到下标为i的数字(设为m)时,首先比较m是不是等于i。如果是则扫描下一个数字;如果不是则再拿它和第m个数字...
2019-09-12 18:49:24 168
原创 c++单例模式----剑指offer第一题
概念单例模式是23种设计模式中的一种创建型模式,也是最容易理解,应用最广泛的模式之一,由于其的这些性质,也是面试中经常被问到的一种设计模式。为一个类唯一的生成一个对象是单例模式完成的主要工作。它的实现可以分为两种,我们先给出饿汉模式和懒汉模式的概念,后面会逐一介绍。饿汉模式和懒汉模式顾名思义,饿汉模式就是在你的程序刚开始运行的时候就创建出单例的对象,而不是等到使用的时候才去创建它;而懒...
2019-09-12 12:51:47 314
原创 快手一二面凉经
快手一面项目负载均衡一致性哈希了解过哪些开源的负载均衡器三次握手的不安全点(syn洪水攻击)为什么是四次挥手tcpdump的使用方法高效的半同步半异步怎么实现,是哪种事件处理模式红黑树的性质,来源以及和bst,avl相比的优点代码:位图的实现用位运算表示取余快手二面sql语句:关联查询join输出两行,如何输出三行数据-1用16进制...
2019-09-08 16:55:48 543
原创 宏函数,内联函数和static函数的区别以及应用场景
概述宏函数,内联函数和static函数是c++中不同于普通函数定义的使用其他方式定义的函数,这三种函数有各自的特点和不同的适用场景,我们将在这篇文章中一一说明。先来看三者的定义。定义宏函数:一般说来,宏是一种规则或模式,或称语法替换 ,用于说明某一特定输入(通常是字符串)如何根据预定义的规则转换成对应的输出(通常也是字符串)。这种替换在预编译时进行,称作宏展开。宏函数归根结底还是一种宏...
2019-09-07 15:46:15 1221
原创 大数斐波那契数列c++实现
引言斐波那契数列的定义如下:定义一组数的第一个为1,第二个为1,之后的每个数都是前两个数之和,将这样的一组数称为斐波那契数。斐波那契数的前十个数是:1,1,2,3,5,8,13,21,34,55。它是面试中高频出现的一种代码题,主要考察的技能是递归(斐波那契数通常用递归来实现,循环也可以)。但这也是斐波那契数列最基本的操作,再深入一点的话,可以将斐波那契数列和大数加法结合起来,这也是我们这...
2019-09-07 13:32:13 5251
原创 CSDN如何设置代码块的背景
1、我们首先进入自己的博客页面,在页面的右上角有一个“管理博客”的按钮,点击2、进入下面的页面后,在左侧的选项栏中有一个博客设置,点击进入3、之后我们就可开始设置自己的博客主题了4、下拉可以看到有一个代码片样式的下拉框,我们可以根据自己的喜好设置代码片的风格...
2019-09-06 14:33:46 1621
原创 k个一组翻转链表
题目描述leetcode题目25,描述如下/*给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。示例 :给定这个链表:1->2->3->4->5当 k = 2 时,应当返回: 2->1->4->3-&...
2019-09-05 21:08:27 173
原创 合并k个有序链表
题目描述这是leetcode上面的一道编程题,题目如下/*合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。示例输入:[ 1->4->5, 1->3->4, 2->6]输出: 1->1->2->3->4->4->5->6*/解题思路利用递归分治的思想将k个有...
2019-09-05 20:46:31 332
原创 B树和B+树
概述这篇文章主要将一下B树和B+树的结构,性质,特点以及应用场景。什么是B树B树是一种平衡的多路查找树,它和平衡的二叉查找树的区别在于B树的一个节点可以有多个键值存在,也就是有多个链接存在,B树中节点最大的孩子数目称为B树的阶。到这里大家可能会发现其实2-3树,2-3-4树等都是B树的一种实例,2-3树是3阶B树,2-3-4树是4阶B树。B树的性质一个m阶的B树具有如下属性:...
2019-09-03 20:49:44 445
原创 红黑树的插入和删除
概述本篇文章主要讲述红黑树的插入和删除操作,而红黑树的查找操作和普通的二叉查找树完全相同,因此不用过多的介绍。因为向红黑树中插入或删除节点时会引起红黑树结构的变化,有时还会破坏红黑树的性质,所以为了在插入或者删除之后继续保持满足红黑树的性质,我们不得不做很多的工作,主要有左旋转,右旋转,改变节点颜色等。红黑树的查找在红黑树中查找一个键值是否存在时,首先从根节点开始,如果根节点的键值等于...
2019-09-02 17:04:07 316
原创 红黑树和2-3树
概述这篇文章主要讲一下红黑树的产生起源,以及红黑树的五种特性,为什么红黑树会有这写特性。将会接触到一种新的数据结构:2-3树,以及它和红黑树的联系。红黑树的起源:2-3树大家都知道avl树是一种强平衡的二叉查找树,左右子树的高度差的绝对值不大于1.这样的一个规定让avl的查找效率大大提高,但不幸的是,再动态插入种保证树的完美平衡代价太高了。因此我们提出了一种新的结构2-3树,在2-3树...
2019-09-02 14:52:07 475
原创 盛趣游戏c++后台面经
讲一下项目你在项目中如何使用libevent的你的项目中封装了哪些tcp有关的函数讲一下面向对象的思想讲一下c++的动多态是如何实现的在构造函数中调用虚函数会不会产生多态调用struct和class的区别i++操作是不是原子操作c++一般如何处理内存泄漏讲一下shared_ptr和weak_ptr拷贝构造函数和赋值运算符重载函数的区别在一个类的成员函数中...
2019-08-31 13:38:38 684
原创 struct和class的区别
概述对于学习c/c++的同学来说,在面试的高频问题中,肯定会有struct和class的区别这一项,今天我们就从两个方面来看一下,struct和class的区别到底是什么。第一个是c中的struct和c++中的class的区别;第二个是c++中的struct和class的区别。c语言中的struct和c++中的class的区别在c语言中为了将一些变量组合起来做为一个整体使用,我们用到了...
2019-08-31 11:31:27 893
原创 深信服面经:数通通讯,物联网方向c++
深信服一面new和malloc的区别执行free函数时做了什么strlen和sizeof的区别strcpy函数的缺陷libevent的定时器底层的数据结构是什么当libevent定时器的一个一秒事件阻塞两秒钟的时候,会发生什么快速排序的思想,平均时间复杂度,最坏时间复杂度哈希表,哈希冲突traceroute的工作步骤,工作原理二面讲一下实习项目epo...
2019-08-29 21:35:50 2357
原创 malloc底层工作原理——ptmalloc
概述本文主要分析ptmalloc中的对于每个内存块的管理方法:边界标志法和所有内存块的整体管理:分箱式内存管理。以及malloc()函数和free()函数的底层原理和工作步骤。边界标志法ptmalloc使用chunk实现内存管理,不管内存是在哪里被分配的,用什么方法分配,用户请求分配的空间在ptmalloc中都使用一个chunk来表示。用户调用free()函数释放掉的内存也并不是立即归...
2019-08-29 20:51:22 1777
原创 sed命令用法
sed简介sed是Linux下一款功能强大的非交互流式文本编辑器,可以对文本文件进行增、删、改、查等操作,支持按行、按字段、按正则匹配文本内容,灵活方便,特别适合于大文件的编辑。和awk相同,sed也是逐行对文件进行处理。sed命令格式和常用参数格式如下:sed [-efni] 'command'test.txt-e 指定多个处理命令,每个命令之前都用-e参数 -f...
2019-08-23 21:04:06 348
原创 awk命令的用法
awk简介awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。awk工作流程是这样的:读入有'\n'换行符分割的一条记录,然后将记录按指定的域分隔符划分域,填充域,$0则表示所有域,$1表示第一个域,$n表示第n个域。默认域分隔符是空格awk命令格式awk [-F|-f|-v] ‘BEGIN{} //{command1; command2} END{...
2019-08-21 13:55:36 381
原创 三种I/O复用的比较
select,poll,epoll区别:1、select对监听的文件描述符的个数有限制,由FD_SETSIZE的值决定为1024个,而poll和epoll都对文件描述符的和数没有限制2、select和poll都是每次调用到时将要监听的文件描述符从用户空间拷贝到内核空间,而epoll是在内核中自己维护,不需要拷贝3、select和poll都是用一个系统调用来完成i/o复用,而epoll是靠一...
2019-08-20 11:38:33 193
原创 二叉树遍历:前序中序后序,递归非递归,层次遍历(代码)
#include<iostream>#include<queue>#include<stack>using namespace std;typedef char elemType;#define END '#'typedef struct Node{ Node* leftChild; Node* rightChild; elemType...
2019-08-18 19:47:00 256
原创 腾讯秋招面经
1、负载均衡中的一致性哈希如何使用的2、服务器的半同步半异步怎么使用的主线程异步监听listenfd,当有客户端连接的时候,将连接连接套接字发给工作线程,工作线程也是异步处理,使用libevent将所有套接字监听起来。所以是一个高效的半同步半异步3、服务器和客户端通讯的步骤4、数据包在网络中传输的具体过程应用层将要发送的数据发送到传输层,传输层加上传输层的头部信息之后给到网络层...
2019-08-18 19:21:33 512
原创 阿里秋招面经
一面 1个小时自我介绍1、讲一下项目应用场景:当一个游客去一个景点旅游的时候,进入景点要用身份证刷闸机,这个闸机就相当于我系统里的信息采集机,负责采集游客的身份证号码,传给该景点的客户端,这个客户端主要分为两大部分,一个就是充当这个信息采集机的服务器,接收信息采集机发送过来的游客信息;另外一个就是负责给服务器发送请求,接收服务器的消息。当服务器收到这个客户端发来的请求之后,会根据之...
2019-08-18 19:17:31 391
原创 gdb调试命令
gdb调试命令启动gdb调试: gdb program --------> 启动名为program可执行文件的调试 gdb program PID ----> 调试一个正在运行的程序,根据程序名和进程号PID(ps可以查看PID) gdb program . attach PID --> 调试一个正在运行的程序,根据程序名进入gdb,attach关联进...
2019-08-18 19:13:54 296
原创 进程的管理和调度
linux进程管理和调度进程的管理结构也叫做PCB(进程控制块),是一个task_struct类型的结构体,里面保存了关于该进程的所有信息,系统中每个进程的pcb都由一个链表连接起来 1、进程的状态和执行信息,进程ID号,优先级,程序执行有关的时间信息等 2、已分配的虚拟内存的信息 3、进程所属用户ID,组ID,进程的权限进程的分类 1、软实时进程:需要快速...
2019-08-18 16:17:03 567
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人