自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 正则表达式

正则表达式正则表达式由字面文本和具有特殊意义的符号组成,这里记录的是扩展正则表达式位置标记位置标记锚点(position marker anchor)是标识字符串位置的正则表达式。默认情况下,正则表达式所匹配的字符串可以出现在任意位置。正则表达式描述示例^指定了匹配正则表达式的文本必须起始于字符串的首部^tux能够匹配以tux起始的行$指定了匹配正则表达式的文本必须结束于目标字符串的尾部tux$能够匹配以tux结尾的行标识符标识符是正则表达式的基础组成部分

2020-12-17 10:14:56 171

原创 /dev 目录

/dev 目录dev目录是一个特殊的目录,其内部包含许多设备文件。这些设备文件为操作系统上次应用提供了访问底层设备的接口。对这些设备文件的I/O操作都会按照如下的流程进行设备文件I/O ——》底层设备驱动--》 实际设备为什么存在这个文件夹“如何访问物理设备”是一个经典的问题,不是只利用文件系统就能满足我们所有的开发任务了,有的时候我们开发的程序必须要能够访问逻辑扇区(LGB)而不是简单地利用内核提供的文件系统,例如ghost备份还原系统、分区表的备份等这些操作。注意点设备文件并不代表实际物理设

2020-12-16 14:08:49 1810

原创 Linux 文件权限

Linux 文件权限linux文件是基于角色的访问控制策略。每个文件对应三种角色,即所有者(user)、用户组(group)、其他用户(others)。针对这三种角色的不同,其设置了三种访问控制策略读R、写W、执行X。目录和文件访问控制标记意义不同Linux文件可以被分为许多种不同的类型,如普通文件、目录、字符设备、块设备、符号链接、管道、套接字等等。但是对于访问控制来说,其只有两种目录、普通文件(除了目录以外的其他文件类型)。普通文件R : 读取文件的内容W : 可以修改、截断文件内容

2020-12-15 22:03:46 135

原创 EDKII vUDK 2018 在linux下安装

EDKII vUDK 2018 在linux下安装官方安装指导以下安装过程使用Ubuntu16.04 LTS AMD64 Desktop安装基本工具sudo apt-get install build-essential uuid-dev git gcc-4.8 qemu与官方指导不同,这里安装的是GCC4.8,并且不同过apt安装nasm和asl,而采用源码安装的方式进行。所有的软件安装应严格遵守文档里的版本,因为不同版本的软件可能会造成某些意外的错误发生。源码安装nasm、asl

2020-12-01 19:41:14 450

原创 shell调用过程

Shell调用过程下面翻译man bash中的部分内容当bash以交互登录shell或伴随–login选项的非交互式的方式进行调用时,其会读取并执行/etc/profile脚本。之后,其会顺序查找~/.bash_profile, ~/.bash_login, ~/.profile,读取并执行匹配到的第一个可读可执行的文件。–noprofile选项可以禁止这种行为当一个交互shell退出或一个非交互式shell执行exit命令时,bash从~/.bash_logout和 /etc/bash.bash_

2020-11-24 09:46:58 581

原创 单例模式

单例模式what一种设计模式,用于保证全局中仅存在唯一实例why程序中某些类在设计时要求必须仅有一个实例,如果存在多个实例那么在操作时可能会导致程序的异常行为。因此为了保证这一要点我们必须采用某些特殊技术,来限制单例类的构造。单例模式避免了某些错误的行为造成多个实例出现的问题。how无论是哪种单例模式实现,他们所依托的方式都是私有化构造函数,只将构造函数暴露给特定函数。而这些函数负责保证这些类只存在一个实例。单例模式要点全局中能存在一个实例,禁止用户自己声明构造实例线程安全禁止拷贝、移

2020-10-27 21:44:42 129

原创 next_permutation,prev_permutation源码分析

next_permutaion伪代码伪代码描述如下,这里只阐述主要步骤,不对异常进行处理// last 表示 A.size() - 1// 1: 从后向前遍历,获取第一个非递增点for i -> last - 1 to 0 if A[i] < A[i + 1] break // 2:从递增序列中找到第一个必A[i]大的元素for j -> last to i + 1 if A[j] > A[i] break// 3、交换swap(A[i], A[j])

2020-09-07 19:56:43 301

转载 Linux文件空洞

2020-09-06 20:32:31 168

原创 insert_iterator分析

insert_iterator为迭代器适配器,用于封装传统迭代器来提供更为丰富的功能。insert_iterator内部维护了两个变量:_Container* container :指向插入的目标容器_Container::iterator iter:插入位置记录其实质上就是调用container->insert源码分析如下: template<typename _Container> // _Container 表示传入的容器类型 class insert_i

2020-09-05 19:01:15 455

原创 管道 & 重定向

重定向管道总结在shell环境下,应用程序的交互只有输入和输出。与图形化界面相比其交互形式单一,无法实现各种丰富的交互模式,唯一提升交互体验的方式就是更好地格式化标准输出。但是,多样的交互方式对人来说是友好的,对计算机来说并不友好。如果你想实现程序的自动运行,在shell环境下是非常容易实现的。因为你可以通过获取标准输出提取关键信息的方式来完成。但是在图形化界面的情况下,其处理将会变得异常困难。你不易传递如下信息(先点击那个按键,再点击哪个选择框,如果出现异常某个图标会变成红色,再怎么处理)。所以s

2020-09-03 11:25:49 259

原创 220. Contains Duplicate III

问题传送门问题分析此问题划分为两个问题:1、定义一个大小为k的窗口,其最右端元素与左侧任意元素组合是否能满足diff < t的要求。2、当上一个窗口不存在时,我们需要滑动窗口,此时窗口中的元素发生变化,第一个元素移除,窗口的next元素进入。我们如何利用原有窗口的数据来高效执行,即减少重复计算。代码此代码利用set保存有序顺序的特性,来保证每次增加和删除时窗口内部的数据有序,且增加和删除时时间复杂度为logk(具体参考红黑树)。通过此例我们可以知道当我们想要维护一个时常进行增加删除的有序集

2020-09-02 21:08:57 141

原创 STL _Hashtable源码分析

_HashtableSTL中并没有提供直接提供hashtable,而是通过将其封装为unordered_map和unordered_set来供外部使用,也可以说它们是由_Hashtable来实现的。其_Hashtable的结构如下,其与传统的hash list有相同点但也存在些许不同。同:_M_buckets为nodes指针数组,其保存了node的地址。而nodes中主要保存了2个元素,分别为next指针和value。增删改查过程基本相似,主要分为两个步骤。首先计算hash(key),获取的bu

2020-09-01 17:14:43 599 2

原创 map源码分析

map可谓是最经常使用的关联容器,其实现同样基于红黑树。我们知道红黑树中一个节点保存一个value,其并没有明显的key,value概念,其在插入时比较的是value值的大小。因此我们需要对value和value的compare做一点小小的修改,这样便可以通过红黑树实现这种key,value的关联。其实现过程类似如下代码:我们将map的key, value作为一个整体setvalue,此setvalue便是set的value,之后重定义setvalue的compare行为,使其只比较key,经过这样的修

2020-08-19 16:21:28 582

原创 set源码分析

set是一个关联容器,其内部保存了一系列唯一的且排序的key对象。其内部实现是通过红黑树来完成的,对于红黑树其为带有自平衡功能的二叉搜索树BST。因此,其内部元素有序(BST的中序遍历将会获得一个有序序列)且其可以在log时间内查找相关节点。containerset实质上就是红黑树的包装类而已,查看定义可以获取相关信息。其包含数据成员_M_t,此数据成员就是红黑树,之后所有的操作都是对其进行set::iterator就是_Rep_type::const_iterator template&l

2020-08-19 11:36:15 200

原创 multiset源码分析

set是一个关联容器,其内部保存了一系列排序了的不重复的类型为key的对象,其排序使用构造时传入的compare函数。其插入、删除、查找在log时间复杂度内完成。在STL中其使用红黑树来实现此结构,对于红黑树这里不多做介绍,其实质上就是带有平衡功能的二叉排序树,所以说红黑树的中序遍历有序,其属于二叉树。containerset的实现就是借助红黑树实现,在如下定义中,我们可以看到如下信息其定义了_Rep_type _M_t这一数据成员变量,其类型为typedef _Rb_tree<key_typ

2020-08-19 10:43:57 478

原创 array源码分析

array容器封装了一个固定大小的数组,其语义上等价于一个struct,其内部只封装了T[N]作为其唯一成员。这样便可以既拥有C-style数组的性能也拥有标准容器的便利性。其实现等价于如下template<typename _Tp, std::size_t _Nm>struct array { _Tp _M_elems[_Nm];}我们都知道标准容器在内存分配中采用的方式为alloc内存分配器分配,其从根本上来说都是调用动态内存分配。那么这种内存分配方式就存在性能损耗,我们程序运

2020-08-18 18:52:51 532

原创 forward_list源码分析

forward_list是一个单链表的实现,相较于list,其有更高的空间存储效率,但是其迭代器只能进行单向移动。其构造如图所示:与list进行比较可以发现,其头部节点不再存储任何数据并且结构体中也没有开辟空间来存储forward_list的大小,所以其并没有实现size()这个成员函数,即我们无法在O(1)的时间内获取forward_list大小。其尾部节点并没有指向头部节点,其指向的为nullptr,这样做能有效保证其迭代器的单向性。_Fwd_list_node_Fwd_list_node继

2020-08-18 17:27:20 456

原创 list源码分析

list是CPP对双向链表的实现,其结构相对于传统的链表结构并无太大差异。CPP的实现将第一个节点设置为头节点,其存储的元素类型为size_t,用于存储list链表中数据元素的个数。其后的节点才是真正存储数据的节点。并且其为快速定位头部尾部且同一插入删除操作,其定义为循环链表。其结构示意图如下_List_node_List_node是链表中节点的定义,其包含三个元素,分别是传统previous指针、next指针、存储元素_Tp。其中previous指针、next指针是基类_list_node_bas

2020-08-18 15:09:26 375

原创 Deque源码分析

deque在实现时使用一连串固定大小的数组和一个书签来实现,其结构图如下:假设此时我们存储的数据类型为T,那么Nodes数组中存储的类型便为T*,即T[]的位置。而T[]则是实际存储数据的内存位置。这种结构在empty()时,其Nodes下不会挂载任何数组,当我们需要插入元素时,会在Nodes的中间开始挂载而不是两端进行。这样便保证了deque可以进行两端的任意插入操作。插入操作时,会先判断当前数组是否还有剩余空间,如果当前数组还剩余空间则在数组空间内placement construct,否则我们需要申

2020-08-16 15:53:06 288

原创 vector源码分析

这里引用源码中的一段描述In some terminology a %vector can be described as a dynamic C-style array, it offers fast and efficient access to individual elements in any order and saves the user from worrying aboutmemory and size allocation.vector毫不夸张得说就是有动态内存分配功能的传统数组

2020-08-14 21:53:09 1092 1

原创 红黑树

红黑树红黑树是一个重要的数据结构,花了一天多写的红黑树#include <iostream>using namespace std;enum RBTColor{RED, BLACK};struct RBTNode { RBTColor color; int value; RBTNode *parent; RBTNode *left, *right; RBTNode(int val, RBTColor color, RBTNode *p

2020-08-13 23:10:16 110

原创 weak_ptr和shared_ptr功能总结

结构分析weak_ptr和shared_ptr都包含一个_M_refcount数据成员,追溯其定义,内部包含一个_Sp_counted_base<_LP>* _M_pi。shared_ptrshared_ptr能够实现其功能依赖于对于多个shared_ptr只实例化一个_Sp_counted_base<_Lp>。当我们通过某一shared_ptr初始化另一shared_ptr时,其会执行如下两个步骤1、this->_M_ptr = other->_M_ptr

2020-08-09 15:57:45 1045

原创 weak_ptr源码分析

在经历过shared_ptr源码分析之后,我们接下来继续分析weak_ptr。weak_ptr是作为shared_ptr的补充而出现的,用于避免循环引用问题。weak_ptr结构与shared_ptr近乎一致,这里直接写出部分结构和关键函数。weak_ptr<_Tp>继承自__weak_ptr<_Tp>,其主要功能都在__weak_ptr<_Tp>中实现。__weak_ptr包含数据成员element_type* _M_ptr;和__weak_count<

2020-08-09 11:05:56 537

原创 shared_ptr源码分析

shared_ptr是从C++11开始提供的智能指针,用于管理多个指针对同一实体的资源释放问题,保证在多个指针指向同一实体时,仅最后一个指针解除指向时才会释放资源。shared_ptr构造shared_ptr<_Tp>继承自__shared_ptr<_Tp>,其功能主要由其实现。让我们以单值构造函数为切入点开始分析。 template<typename _Yp, typename = _Constructible<_Yp*>> explici

2020-08-08 23:09:45 1966 2

原创 987. Vertical Order Traversal of a Binary Tree

问题传送门解题思路常规树的遍历顺序只有四种,这里题目要求的遍历顺序全都不符合这些遍历要求。所以我们必须通过全部遍历完再整理这种思路去解决问题。遍历过程中我们记录每个节点的[x, y, val],然后不难发现对于全部节点,这就是一个custom sort问题,这里我们还可以利用tuple支持compare,来减少代码工作。代码class Solution {public: void traveNode(TreeNode* root,int x, int y, vector<tuple

2020-08-07 21:05:17 101

原创 43. Multiply Strings

问题传送门解决思路这个代码实现的思路就是简单的小学加减法:999 * 999 = 999 * 9 + 999 * 90 + 999 * 900 = 999 * 9 + 999 * 9 * 10 + 999 * 9 * 100。从中我们可以看出,乘法问题拆分成了两个子问题:1、大数与一位数的乘法问题2、大数之间的加法代码class Solution {public: string addtion(string num1, string num2) { if(num1.

2020-08-05 21:38:59 112

原创 342. Power of Four

问题传送门解决思路4的n次幂等价于(1 << 2 * n),所以其判断准则就变成了:1、其二进制表示只能且必须存在唯一的一位为1,其余bit为0(num & (num - 1)) == 02、其1bit,位于的位置为 2 * nnum & 0x55555555代码class Solution {public: // power of four = power of two, with the set bit appearing at an odd pos

2020-08-04 18:45:31 101

原创 pair笔记

pairpair是一个struct 模板,其定义如下template< class T1, class T2> struct pair;从中我们可以看出其实现依靠struct。从使用方面进行考虑,其为programmer提供了方便的使用,我们不必为每次使用一个简单的二元struct而专门定义一个struct自定义类型,而是交由编译器自动实现。相较于其他容器,如vector<>。其利用struct实现,所以其内存占用栈空间,不用在运行时申请地址空间。所以其在

2020-07-20 22:23:37 132

原创 priority_queue使用

priority_queue分析priority_queue是容器适配器,并不是容器。其并没有单独实现任何容器相关功能,而是在现有容器的基础上进行了再封装而已。参照如下源代码我们不难看出,其实现依靠了algorithm库相关与heap的操作 // stl_queue.h push方法 void push(value_type&& __x) { c.push_back(std::move(__x)); std::push_heap(c.begi

2020-07-20 16:59:50 170

原创 chrono库笔记

chrono库主要包含clocks、time point、duration三个主要类型。durationduration为一个模板类,表示时间间隔,其定义如下:template<class Rep, class Period = std::ratio<1>>Period表示一个时钟滴答周期,每当经过一个Period秒时,其Rep类型的滴答总数就会执行count + 1。在日常使用中Rep可以为整数或者浮点数,Period使用标准库中的分数模板ratio进行表示。durat

2020-07-16 17:28:27 600

原创 Windows 10下EDK2 stable 202002安装

介绍本人正在进行UEFI开发的学习,这次安装是在window环境下安装的,自己在安装过程中也是遇到了很多问题,有些问题甚至还没有解决找出原因。这次的安装过程记录的是一次成功的安装,但是不保证其他版本软件也能按照如下步骤正常安装。软件安装是门玄学,祝愿各位一切顺利。这里贴出官网的安装链接,能力强的可以参照官网说明进行安装,避免博文中存在纰漏。https://github.com/tianoco...

2020-04-08 20:55:51 2921 4

原创 316. Remove Duplicate Letters

问题分析将问题转化为递归问题,我们可以获取如下解题思路。从s中选择一个字符c,此字符满足如下条件字符c后面有剩余所有未出现的字符。例如bcab,其中s[0]后面有集合{c、a} = {a、c、b} - {b} 。而s[2] 后面的集合为{b} != {a、c、b} - {a}。c为满足条件1中所有字符最小的情况选择完c之后,我们从c的位置开始截取新字符串subs,其位置为c的位置+1...

2020-04-01 00:05:48 208

原创 153. Find Minimum in Rotated Sorted Array

问题传送门问题分析问题的可递归化要求其子问题与父问题一致。我们观察不难得出利用二分查找,可将数组划分为两个类型。一个为按照生序排序好的数组,而另一个为与源问题相同的旋转数组。我们可知其解位于roated数组当中。代码class Solution {public: int binaryFindMin(vector<int>& nums, int l, int ...

2020-03-30 21:29:03 75

原创 297. Serialize and Deserialize Binary Tree

问题传送门问题分析我们想要序列化二叉树,可以像Leetcode序列化二叉树那样,存储所有的节点和NULL。我这里采用另一种方式,根据二叉树定义。每一个节点只有一个父节点。所以我们可以将二叉树变为一组pair<int, int>信息,first表示val。second表示父节点的索引。由于单独仅依靠父节点索引无法辨别其是父节点的左孩子还是右孩子。所以我们使用正负索引来对其进行辨别。...

2020-03-25 22:24:21 84

原创 Subsets

思路SubSet 问题可以转换为一个递归问题 {first_item , SubSet(N - 1)} U {SubSet(N - 1)}。代码78. Subsetsclass Solution {public: vector<vector<int>> subsets(vector<int>& nums) { vecto...

2020-03-24 22:53:02 120

原创 1329. Sort the Matrix Diagonally

分析我们只需要将对角线上的元素放置到vector中进行排序,排序完成在依次放回便可完成此问题。不过这里有一个对角线元素性质,可以让代码更为优美。即如果a(x1, y1) 和 b(x2, y2)位于同一个对角线上,那么x1 - y1 == x2 - y2。代码class Solution {public: void sortOneDia(vector<vector<...

2020-03-17 20:53:17 100

原创 452. Minimum Number of Arrows to Burst Balloons

分析代码class Solution {public: int findMinArrowShots(vector<vector<int>>& points) { if(points.empty()) return 0; sort(points.begin(), points.end(), ...

2020-03-14 18:56:07 78

原创 234. Palindrome Linked List

问题传送门解决思路举例来说,假设此时链表结构为1-> 2 -> 3 -> 4 -> 5 -> 6。我们可以将其拆分为两个链表1-> 2 -> 3和4 -> 5 -> 6。然后我们反转第二个链表为6 -> 5 -> 4。之后对两个链表进行比较,其时间复杂度O(n),空间复杂度O(1)。代码class Solution {...

2020-03-12 18:26:55 141

原创 Weekly Contest 179

1374. Generate a String With Characters That Have Odd Countsclass Solution {public: string generateTheString(int n) { string s; if(n % 2 == 0){ for(int i = 0; i < ...

2020-03-08 20:01:33 92

原创 Path Sum

112. Path Sumclass Solution {public: bool isPathSum(TreeNode* root, int sum, int target){ if(root == nullptr) return false; if(root->left == nullptr && roo...

2020-03-05 20:48:56 84

空空如也

空空如也

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

TA关注的人

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