自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(66)
  • 收藏
  • 关注

原创 初识Objective-C

一、什么是Objective-CObjective-C是C语言的一个扩展集,几乎所有的OS X或IOS平台上的应用程序都是用该语言开发的。由于是对C的扩展,因此本篇以及之后的所有Objective-C相关的文章都将重点介绍Objective-C在C上添加的新特性,那么C的基础此处将不再赘述。二、简单的Objective-C程序#import <Foundation/Foundation.h>int main(int argc, const char* argv[]){ NSLog(@

2020-11-29 22:16:38 323 1

原创 Linux文本三剑客之 sed

sed概念: sed是一种流式编辑器,他一次只能处理一行数据。处理时,把当前的行内容存储在临时缓冲区中,成为“模式空间”,接着用sed 命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非使用-i选项。sed语法格式:sed [option] "pattern(匹配模式) command(sed命令)" [filename]常用选项(option):主要是用来控制sed的处理流程。-n:只打印模式匹配的行-e:多点编辑

2020-05-23 17:43:08 309

原创 Linux文本三剑客之 grep

grep什么是grep?grep说白了就是一个文本过滤器,帮助用户在文件中查找我们想要的内容,并打印出来。以及可以使用正则表达式查找。grep的语法格式1.从文件中找到匹配的pattern的行。grep [option] pattern [filename]2.结合管道(’|’)一起使用,从管道中找出匹配pattern的行。ps aux | grep [option] patterngrep的常用选项-v :不显示匹配行的信息-i :搜索时忽略大小写-n: 显示行号-r: 递归

2020-05-22 14:54:17 210

原创 C++ 红黑树、关联式容器map、set

在很久之前我们说过AVL树,其是一种完全平衡的二叉搜索树。这篇文章我们将介绍另一种也是我们比较常用的二叉搜索树:红黑树红黑树是在二叉树的基础上,给结点增加了两种颜色(红,黑),以及通过其特定的性质来保证:树中最长路径的的结点个数不会超过最短路径结点个数的两倍。因此红黑树是一个近似平衡的二叉搜索树。因此红黑是是一个仅此平衡的二叉搜索树。其时间复杂度为O(lgN),与AVL树相同。但是大量证明表...

2020-03-22 19:17:34 358

原创 二叉树的基本操作

因为个人对于二叉树的操作有些地方理解的还不是很到位,所以本篇文章来总结一下二叉树的一些基本操作。那么二叉树的相关概念,这里就不再赘述。(本文用的是链式结构表示二叉树)结点信息struct TreeNode{ int val; TreeNode* left; TreeNode* right; TreeNode(int x):val(x),left(nullptr),right(null...

2020-03-04 18:03:03 214

原创 设计模式 之单例模式

什么是设计模式?简而言之。就是一些大佬总结出来的经验,将一些常见的问题或场景,设计成一种套路,可以让后续的程序员快速设计自己的代码。那么为什么我们需要用设计模式呢?单例模式代码框架稳定,代码复用度高,比较容易理解。常见的设计模式:创建型模式:用于构建对象,将实现从系统中分离出来。单例模式。结构型模式:用于在许多不同的对象中形成大型的对象结构。适配器模式行为模式:管理对象观察者模式...

2020-02-27 09:05:34 248

原创 数据结构 哈希搜索结构

我们之前学过的查找方法有很多:1.静态搜索顺序查找:O(N)。二分查找:O(logN)。2.动态搜索二叉搜索树:最优查询效率O(N)。AVL树:O(logN)。但是上述的查找都是要经过元素比较才能进行查找的。查询的效率取决于比较的次数。哈希结构我们理想的搜索方法是:不进行元素比较,而是对每个元素的存储格式进行改造,通过某种方式,将元素与存储结构建立一一对应的关系。这样就可以通过这...

2020-02-17 14:24:05 274

原创 Linux POSIX信号量、实现生产者消费者模型

posix与system v的区别之前我们在进程间通信中学到过system v版本的信号量,它和posix的区别在于:system v版本的用于进程之间,posix版本的用于线程之间。他们的主要区别在于信号量和共享内存。信号量的区别:1.system v版本的信号量一般是随内核的,无论有无竞争都要执行系统调用,所以性能上比较差。它的接口是semget,semctl,semop。2.pos...

2020-02-17 12:01:31 630

原创 Linux 生产者消费者模型

生产者消费者模型生产者消费者模型是非常常用的模型。本文用的是互斥和同步实现生产者消费者模型。下面来介绍是如何实现生产者消费者模型1.在模型(生产者消费者模型)中,我们的临界资源不再是单单的一个数了,而是存储多个元素的队列,我们用的是STL中的queue容器。2.模型中有生产者和消费者。生产者:网队列中放数据。消费者:从队列中拿数据。如果我们仅仅只用queue当做是模型的临界资源是不满...

2020-02-16 20:51:58 245

原创 Linux 同步:条件变量

我们知道互斥是为了保证每次只能有一个执行流访问临界资源。接下来我们看看为什么还需要同步?同步同步是为了保证执行流访问临界资源的合理性。 也就是说当没有临界资源了,让执行流(消费者)进行等待,等待另一个执行流(生产者)来生产一个临界资源,之后再唤醒刚才进入等待的执行流进行访问资源。(举个例子:现在有一个全局变量g_val=0,但是有一个执行流A想对g_val进行-1操作,因为临界资源此时为0,...

2020-02-15 15:10:09 144

原创 Linux 互斥:互斥量、死锁及死锁检测、读写锁、自旋锁

我们先来看看为什么需要同步和互斥呢?因为需要保证线程安全,线程安全是指多个线程在同时运行时访问临界资源,不会导致程序产生二义性,程序结果唯一。但是多个线程在对临界资源进行的是非原子操作,有可能被其他线程打断,从而导致操作和得到结果不一致,进而产生程序的二义性。所以就需要同步与互斥来保证。原子操作:操作一步完成,要么完成,要么没有完成,不存在中途被其他执行流打断。互斥功能:每一次只能有一个执...

2020-02-14 16:48:55 273

原创 Linux 线程控制

线程控制线程控制分为:线程创建-》线程终止-》线程等待-》线程分离我们首先来说说线程创建:线程创建Linux下线程是用户级线程,所以系统并没有给我们提供相关接口。线程控制当中我们使用的是库函数。(由此也可以验证在内核中是没有线程这个概念的。)int pthread_create(pthread_t *thread,const pthread_attr_t *attr,void*(*sta...

2020-02-13 16:00:42 139

原创 Linux 线程的概念

多线程

2020-02-10 14:06:05 176

原创 Linux 进程间通信

进程间通信

2020-02-10 14:04:46 129

原创 Linux 一切皆文件

基础IO

2020-02-10 14:04:15 266

原创 牛客 丑数

题目要求:把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。解析思路:参考大佬:事无巨细,悉究本末(2楼)首先从丑数的定义我们知道,就是说一个丑数一定由另一个丑数乘以2或者乘以3或者乘以5得到,那么我们从1开始乘以2,3,5,就得到2,3,5三个丑数,在从这三...

2020-02-09 15:51:04 218

原创 牛客 把数组排成最小的数

题目要求:输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。思路解析:刚开始没什么思路,只是想把越大的数转为字符串放在后面,越小的数放在前面。之后参考了一篇的博客,一下就明白了。https://blog.csdn.net/fanzitao/article/detai...

2020-02-08 17:32:18 177

原创 牛客 整数中1出现的次数(从1到n整数中1出现的次数

题目要求:求出113的整数中1出现的次数,并算出1001300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数(从1 到 n 中1出现的次数)。...

2020-02-08 15:59:47 197

原创 牛客 字符串的排列

题目要求:输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。递归算法的四个特性:1.必须有可达到的终止条件,否则程序将陷入死循环。2.子问题在规模上比原问题小。3.子问题可通过再次递归调用求解。4.子问题的解应能组合成整个问题的解。思路解析:这是个递归求解的问...

2020-02-07 17:05:52 245

原创 牛客 二叉搜索树与双向链表

题目要求:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。

2020-02-06 16:23:38 132

原创 C/C++ const用法

C/C++中const的用法1.修饰常量const int tmp;//tmp为常量,不可改变int const tmp;//tmp为常量,不可改变2.修饰指针主要是看const 在*前后,在 * 则指针指向的内容为常量,在 * 后则指针为常量(也就是指针的指向不能变)。const int *ptr;//指针所指向的内容为常量。int const *ptr;//指针所指向的内容为常...

2020-02-05 18:08:07 134

原创 牛客 复杂链表的复制

题目要求:输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)思路解析:分为三步:1.复制每个结点,并将复制的结点放在原结点后面。(比如:复制A结点得到A1,将A1插入到A后面),这样做是为了找到复制结点的random指针域。...

2020-02-05 16:34:20 104

原创 牛客 二叉搜索树的后序遍历序列

题目要求:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。思路解析:由题目得到:因为是后序遍历,所以序列最后一个元素一定是树的根root。又因为是二叉搜索树,所以左子树所有的值小于root,右子树所有的值大于root。 因此我们可以通过遍历整个序列来在找到第一个大于root的值,从而找到左右子树,再递归...

2020-02-04 16:00:16 153

原创 牛客 顺时针打印矩阵

题目要求:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 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。解题思路:1.定义四个变量left、top、right、butt来规定矩形的左、上、右、下边界。2.打印第一圈的...

2020-02-02 17:40:17 141

原创 牛客 树的子结构

题目要求:输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)解决此题需要分为两步:1.在A树中找到与B树的根节点的值相等的结点R。2.再判断B树是否与A树中以R为根的子树具有相同的结构。第一步:1.递归遍历树A,在树A中找与B树的根节点的值相等的结点R。2.若找到进行第二步操作。3.若没找到,则返回false。代码实现如下:bool Ha...

2020-02-01 16:55:41 103

原创 Linux 环境变量

环境变量环境变量也是Linux操作系统中非常重要的一部分。我们来看看什么是换环境变量。概念: 指的是用来在指定操作系统运行环境的一些参数。举个例子:我们写完一个代码后,进行链接的时候,我们并不知道链接的静态库或者动态库在哪里,但是我们依旧可以链接成功。这就是因为环境变量帮助编译器进程查找。常见的环境变量:1.PATH:指定命令的搜索路径。2.HOME:指定用户的主工作目录,默认为用户...

2020-01-29 17:51:21 118

原创 C/C++ sizeof 与strlen 区别

sizeofsizeof是分配给对象实际所占的内存空间的大小,不受里面的内容限制。sizeof(…)是****运算符,由于是在编译时计算的,所以不能用来计算经过动态分配的内存空间的大小。实际上使用sizeof来返回类型以静态分配的对象、结构体、数组的空间,返回值和其内容没有关系。strlenstrlen是计算字符串的长度,以‘ \0 ’为字符串的结束标志。返回从第一个地址开始到‘ \0 ...

2020-01-27 16:51:24 123

原创 C/C++ 整型的上下限INT_MAX / INT_MIN

整型上下限C/C++中整数的最大值和最小值用常量INT_MAX和INT_MIN来表示。定义在limits.h。数值大小:因为int是32为,所以根据二进制规则:INT_MAX: 2^31-1=2147483647;INT_MIN: -2^31+1=-2147483648;所有超过这两个限值的树,都会出现溢出。如果使用的整数可能会超过这两个限值,则可以使用长整型long long ,64...

2020-01-18 18:41:10 2819

原创 C++ AVL树

AVL树平衡二叉搜索树我们知道当二叉搜索树退化为单支树时,该树就变得不平衡了,所以为了解决此问题,就引出了平衡二叉搜索树-----当向二叉搜索树中插入新结点后,如果能保证每个结点的左右子树高度之差的绝对值不超过1,这样的树称为平衡二叉搜索树。平衡二叉搜索树有两种:其中一种为AVL树,另一种为红黑树。AVL树性质:1.必须是二叉搜索树。2.左右子树都是AVL树。3.左右子树高度之差(...

2020-01-11 17:47:00 148

原创 文件压缩

在开始之前,我们要知道以下几个内容。什么是压缩?所谓压缩,归根结底就是让文件变得更小,并且可以无损的还原。为什么对文件进行压缩?1.文件太大,为了节省空间。2.提高数据在网络上传输的效率。3.对文件进行保护(加密)。文件压缩的分类:1.无损压缩:源文件被压缩之后,通过解压缩还能还原成和源文件完全相同的格式。2.有损压缩:源文件被压缩之后,通过解压缩不能还原成和源文件完全相同的格式...

2020-01-08 17:16:09 2215

原创 Linux 进程

进程在说进程之前,我们先来说说冯诺依曼体系结构。像我们常见得计算机,或者不常见的计算机,如服务器等。都是遵循冯诺依曼体系结的。下图为冯诺依曼体系结构:对于冯诺依曼,要注意几点:1.此处的存储器是指内存。2....

2020-01-08 15:16:04 225

原创 C++ 二叉搜索树

二叉搜索树二叉搜索树又称为:二叉排序树,其也可以是一个空树,或者具有以下性质的树也可以被称为二叉搜索树:1.若左子树不为空,对于任意节点,比其左子树中任意节点都大。2.若右子树不为空,对于任意节点,比其右子树中任意节点都小。3.最左侧的节点一定是最小的,最右侧的节点一定是最大的。4.当对二叉搜索树进行中序遍历,得出来的是有序序列。二叉搜索树的操作:...

2020-01-05 21:22:05 255

原创 C++ 异常

异常先回忆一下C语言中处理错误的方式:1.终止程序:如assert、exit(0)。缺点:暴力,对用户不是很友好。2.返回错误码。(常用,错误码是Windows操作系统提供的)若用VS编译器,用GetLastError() 来获取最近一次发生错误的错误码。并且可以通过VS工具–错误查找的选项,来输入对应的错误码,来看对应的错误描述。但是仅限于一部分错误码描述,若要查特别大的错误码的描述,可...

2019-12-28 17:59:33 191 1

原创 C++ 智能指针

智能指针智能指针的使用以及原理:智能指针的思想:RAllRAll是一种利用对象声明周期来控制程序资源的一种技术。它可以在对象构造时获取资源,在对象析构时候释放资源,完全不用用户自己释放,当然也解决了用原生态指针的缺陷。RAll思想的好处:1.不用自己显示释放申请的资源,用户不用考虑什么术后该释放资源,将这些交给编译器即可。2.用这种方法,对象所需的资源在其生命周期内始终保持有效。下面...

2019-11-17 23:28:34 351

原创 Linux 基础的开发工具以及使用方法

Linux软件包管理 yum我们先来看看什么是软件包?软件包管理就相当于我们手机上的应用商店,软件包就相当于手机上的APP。yum是linux下非常常用的一种包管理器。...

2019-11-12 17:30:53 150

原创 Linux 权限

权限概念:在Linux用户下有两种不同的用户:超级用户(root)、普通用户。超级用户:可以做任何事情,不受限制。(类似于,用自己的东西)进入超级用户命令:su或者su -root超级用户的命令提示符:"#"。普通用户:只能做有限的事情。(类似于,别人的东西,他只允许你看或者动)普通用户的命令提示符:"$"。Linux权限管理:文件访问者的分类:在linux中文件分为三类:...

2019-11-10 17:13:24 203

原创 C++ 多态

多态首先我们来说说什么多态?多态就是进行某个行为时,但不同的对象去会有不同的结果。举个例子:买电影票这个行为,普通人去买就是普通票,学生去买就是学生票。这种行为体现的就是多态。多态的实现条件前提:在继承体系下,继承权限是必须是public。1.基类中必须有虚函数(被virtual关键字修饰的成员函数为虚函数),在派生类中要对基类中的虚函数进行重写。(1)重写的时候,必须是在派生类中重写...

2019-11-05 17:37:25 201

原创 C++ 继承

继承概念:继承是使代码可以复用的重要手段,它允许在保持原有类性能的基础性进行扩展,增加功能产生的新类,这个类称为派生类或者子类,那么被继承的类就叫做基类或者双亲类。继承是类层次的复用。派生类:派生类是继承了基类中的成员变量。有以下代码可以验证:class base{public: void setbase(int year, int month) { _year = year...

2019-11-02 18:05:16 180

原创 C++ 模板的特化 模板分离编译

非类型模板参数模板参数分为:类型模板参数和非类型模板参数类型模板参数:出现在模板参数列表中能够,跟在class和typename之后。非类型模板参数:就是用一个常量来作为类或者函数模板的参数,在类或者函数模板中可将该参数当成常量来使用。 template<class T, size_t N>//(T为类型模板参数,N为非类型模板参数) class array { publ...

2019-10-28 18:37:54 186

原创 C++ STL总结

什么是STL?STL是标准模板库。STL是对常见数据结构的封装,以及通用的算法。算法可以操作任意类型的数据并且可以处理任意数据结构。STL六大组件容器:组织数据,对常见数据结构的封装。序列式容器: 对线性数据结构的封装----顺序表&链表序列式容器的接口分类:构造与销毁迭代器操作容量操作元素访问操作修改操作特殊操作string类容器:管理字符串。1.浅拷贝问题的...

2019-10-23 17:48:02 161

空空如也

空空如也

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

TA关注的人

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