自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 C++笔记(随时更新)

一、string key=str; sort(key.begin(), key.end());二、emplace_back优于push_back,能就地通过参数构造对象,不需要拷贝和移动内存,提升容器插入性能;三、swap(nums[i], nums[i-1]);四、vec.at(rand()%(vec.size())),at比下标访问更安全,不会越界报错---------随机访问vec中的元素;五、private:vector<vector> rectangle;public:

2021-01-26 17:41:03 1740 2

原创 linux系统输入ll命令显示信息每一列的意义

linux命令

2022-08-08 15:44:27 6280 1

原创 PHP学习之路——基本语法

PHP

2022-08-06 17:31:48 294

原创 半角和全角的区别

半角和全角

2022-08-02 20:19:28 1118

原创 C中的#pragma pack()的用法

C

2022-07-15 17:12:22 2053

原创 算法结构-树状数组

树状数组

2022-06-29 11:21:34 220

原创 C++学习资料整理

能力项子类别说明推荐学习书籍在线学习链接编程语言C++基础C++成长C++2.0设计思想最新技术编译构建编译、链接CMake进阶之路语言实现多核多线程性能设计模式模板元编程通用知识正则表达式安全可信编码规范地址消毒效率工具在线工具调试工具IDE...

2022-05-25 17:04:25 640

原创 C++智能指针

概要:记录一下c++里面的四个智能指针: auto_ptr, shared_ptr, weak_ptr, unique_ptr 其中后三个是c++11支持,并且第一个已经被c++11弃用为什么会使用智能指针?当我们new一个内存,必须写相应的delete,但是在delete前程序可能就跳转了或者直接返回了,而这些时候我们没有delete就可能造成内存泄露,使用智能指针可以很大程度避免这个问题----因为智能指针本身就是一个类,当超出了类的作用域,类会自动调用析构函数从而释放资源!auto_ptrun

2022-05-19 14:58:14 448

原创 什么是埃氏筛?

算法原理判断自然数n以内的全部质数,将不大于“根号n”的所有质数的倍数剔除,剩下的数即为该自然数n以内的所有质数Step1. 先设定整个序列2,3,4,5…,n-1,均标记为质数Step2.取出整个序列的第一个质数P,此时为2Step3.将该质数在n以内的倍数全部标记为非质数Step4.根据标记信息按序取该序列中下一个质数Q(2过了是3),先判断其平方值是否超过n,如果是,则算法结束,质数标记完成,否则返回步骤3C++实现:int countPrimesNum(int n){bool not

2022-05-19 11:34:40 182

原创 C/C++ language 开发常见格式化输入输出说明符整理

格式化字符用途修饰符号用途i或者d十进制整数m输出域宽,数据长度<m,左侧补空格,否则实际输出s字符串.n对实数,指定小数点后位数(四舍五入),对字符串指定实际输出位数x或者X十六进制无符号整数-输出数据在域内左对齐(缺省右对齐)e或者E指数形式浮点小数+指定在有符号数的正数前显示正号o八进制无符号整数0输出数值时指定左边不使用的空位置自动填0f小数形式浮点小数#在八进制和十六进制数的前面显示前导0,0xu...

2022-04-27 15:03:59 1239 1

原创 git笔记

git reset HEAD 文件 ----------回退add文件

2021-12-07 11:52:58 206

原创 git解决冲突的方法

一、保留本地的修改 的改法1)直接commit本地的修改2)通过git stashgit stashgit pullgit stash pop通过git stash将工作区恢复到上次提交的内容,同时备份本地所做的修改,之后就可以正常git pull了,git pull完成后,执行git stash pop将之前本地做的修改应用到当前工作区。git stash: 备份当前的工作区的内容,从最近的一次提交中读取相关内容,让工作区保证和上次提交的内容一致。同时,将当前的工作区内容保存到Git栈中。

2021-11-16 19:33:27 2034

原创 sync命令

rsyncRsync(remote sync)是UNIX 及类UNIX 平台下一款神奇的数据镜像备份软件,它不像FTP 或其他文件传输服务那样需要进行全备份,Rsync 可以根据数据的变化进行差异备份,从而减少数据流量,提高工作效率。你可以使用它进行本地数据或远程数据的复制,Rsync 可以使用SSH 安全隧道进行加密数据传输。Rsync 服务器端定义源数据,Rsync 客户端仅在源数据发生改变后才会从服务器上实际复制数据至本地,如果源数据在服务器端被删除,则客户端数据也会被删除,以确保主机之间的数据是同

2021-11-12 16:04:14 775

原创 常用排序算法——快速排序

快速排序的思想以及原理:说白了就是给基准数据找其正确索引位置的过程.   如下图所示,假设最开始的基准数据为数组第一个元素23,则首先用一个临时变量去存储基准数据,即tmp=23;然后分别从数组的两端扫描数组,设两个指示标志:low指向起始位置,high指向末尾.   首先从后半部分开始,如果扫描到的值大于基准数据就让high减1,如果发现有元素比该基准数据的值小(如上图中18<=tmp),就将high位置的值赋值给low位置 ,结果如下:然后开始从前往后扫描,如果扫描到的值小于基准数据就

2021-10-11 10:58:46 256

原创 经常会遇到的加密算法

一、对称性加密对称性密码,也叫共享密钥密码,顾名思义,这种加密方式用相同的密钥进行加密和解密。举例一种最简单的对称加密的方法:生成一个长度和原始信息一样的随机比特0/1序列作为密钥,用它对原始信息做异或运算就生成了密文, 再用该密钥对密文做一次异或运算就可以恢复原始信息存在问题:密钥的长度和原始信息完全一致,如果原始信息很大,密钥也会一样大,而且生成大量真随机比特序列的计算开销也比较大(Rijndael 算法、三重 DES 算法等等有效解决了这些问题。它们从算法上是无懈可击的,也就是拥有巨大的

2021-09-29 15:03:20 757

原创 Linux目录和文件的权限及操作

我在linux某个路径下输入ll会出现上图的信息:第一列:“r”代表查看目录下内容的权限,“w”代表在目录中创建或删除新的文件或目录的权限,“x”代表访问该目录的子目录的权限第一个字符:表示该对象是文件还是目录:d代表目录(图中第一个对象就是,目录),“-”代表文件(图中的shell脚本就代表文件)第二个到第四个字符:表示该对象的owner的权限,图中三个都是rwx,对应二进制111 == 7第五个到第七个字符:表示该对象所属的group的权限,图中有“-”表示二进制0,没有权限,第一个对象就是.

2021-09-27 16:11:43 335

原创 Linux文件系统

Linux 文件系统的一个整体结构(无论是什么版本的 Linux 发行版,根目录 / 基本上就是这些文件)/bin 和 /sbinbin 是 Binary 的缩写,存放着可执行文件或可执行文件的链接(类似快捷方式),如下图:你可以看到 cp, chmod, cat 等常用命令都在这里。注意不要被图标上的 TXT 字样误导了,Linux 不按后缀识别文件类型,/bin 目录中的文件都是可执行的二进制文件,而不是文本文件。与 /bin 类似的是 /sbin 目录,System Binary 的缩写,

2021-09-26 18:21:35 210

原创 C++常见编译错误

expected unqualified-id before numeric constant 数字常量前应为非限定id(也就是变量重复定义了)undefined reference to vtable for … 因为父类中声明的纯虚函数,子类中必须有定义,即函数体

2021-09-26 18:01:08 1666

转载 git原理以及实用小技巧

git的三个分区:working directory,stage/index area,commit historyworking directory 是「工作目录」,也就是我们肉眼能够看到的文件当我们在 work dir 中执行 git add 相关命令后,就会把 work dir 中的修改添加到「暂存区」stage area(或者叫 index area)中去当 stage 中存在修改时,我们使用 git commit 相关命令之后,就会把 stage 中的修改保存到「提交历史」 commit

2021-09-22 16:52:37 80

转载 0-1背包问题

给你一个可装载重量为 W 的背包和 N 个物品,每个物品有重量和价值两个属性。其中第 i 个物品的重量为 wt[i],价值为 val[i],现在让你用这个背包装物品,最多能装的价值是多少?举个简单的例子,输入如下:N = 3, W = 4wt = [2, 1, 3]val = [4, 2, 3]算法返回 6,选择前两件物品装进背包,总重量 3 小于 W,可以获得最大价值 6。题目就是这么简单,一个典型的动态规划问题。这个题目中的物品不可以分割,要么装进包里,要么不装,不能说切成两块装一半。这

2021-09-22 16:10:56 79

转载 如何理解二叉树

一、二叉树的重要性举个例子,比如说我们的经典算法「快速排序」和「归并排序」,对于这两个算法,你有什么理解?如果你告诉我,快速排序就是个二叉树的前序遍历,归并排序就是个二叉树的后序遍历,那么我就知道你是个算法高手了。为什么快速排序和归并排序能和二叉树扯上关系?我们来简单分析一下他们的算法思想和代码框架:快速排序的逻辑是,若要对 nums[lo…hi] 进行排序,我们先找一个分界点 p,通过交换元素使得 nums[lo…p-1] 都小于等于 nums[p],且 nums[p+1…hi] 都大于 nums[

2021-09-22 15:52:37 275

原创 IPC--消息队列MQ

不管是 RocketMQ、Kafka 还是其他消息队列,它们的本质都是:一发一存一消费,再直白点就是一个「转发器」。MQ 的本质1、消息队列最原始的模型:生产者先将消息投递一个叫做「队列」的容器中,然后再从这个容器中取出消息,最后再转发给消费者1、消息:就是要传输的数据,可以是最简单的文本字符串,也可以是自定义的复杂格式(只要能按预定格式解析出来即可)。2、队列:大家应该再熟悉不过了,是一种先进先出数据结构。它是存放消息的容器,消息从队尾入队,从队头出队,入队即发消息的过程,出队即收消息的过程。

2021-09-22 10:15:32 557

原创 C++STL数据结构更改排序规则

1、自定义优先队列内部的排序规则priority_queueauto cmp = [](ListNode* a, ListNode* b){return a->val > b->val; // 降序排序,小顶堆}priority_queue<ListNode*, vector<ListNode*>, decltype(cmp)> pq(cmp);或者重新定义一个结构体(即类)struct Status{int val;ListNode* ptr;

2021-09-18 10:22:15 214

原创 股票买卖问题

核心:用状态机的技巧来解决----实质就是DP table第一题:第一题是只进行一次交易,相当于 k = 1;第二题是不限交易次数,相当于 k = +infinity(正无穷);第三题是只进行 2 次交易,相当于 k = 2;剩下两道也是不限次数,但是加了交易「冷冻期」和「手续费」的额外条件,其实就是第二题的变种,都很容易处理。一、穷举框架这里,我们不用递归思想进行穷举,而是利用「状态」进行穷举。我们具体到每一天,看看总共有几种可能的「状态」,再找出每个「状态」对应的「选择」。我们要穷举所有「状态

2021-09-18 09:49:45 112

转载 算法学习笔记:labuladong--滑动窗口

算法技巧的思路非常简单,就是维护一个窗口,不断滑动,然后更新答案int left = 0, right = 0;while (right < s.size()) { // 增大窗口 window.add(s[right]); right++; while (window needs shrink) { // 缩小窗口 window.remove(s[left]); left++; }}这个算法技巧的时

2021-09-16 20:42:57 1146 1

转载 算法学习笔记:labuladong--二分查找

**核心问题:**二分查找并不简单,Knuth 大佬(发明 KMP 算法的那位)都说二分查找:思路很简单,细节是魔鬼。很多人喜欢拿整型溢出的 bug 说事儿,但是二分查找真正的坑根本就不是那个细节问题,而是在于到底要给 mid 加一还是减一,while 里到底用 <= 还是 <。你要是没有正确理解这些细节,写二分肯定就是玄学编程,有没有 bug 只能靠菩萨保佑。我特意写了一首诗来歌颂该算法,概括本文的主要内容,建议保存:零、二分查找框架:int binarySearch(int[] nu

2021-09-16 15:21:34 626

转载 算法学习笔记:labuladong--单链表攻略

合并两个有序链表ListNode mergeTwoLists(ListNode l1, ListNode l2) { // 虚拟头结点 ListNode dummy = new ListNode(-1), p = dummy; ListNode p1 = l1, p2 = l2; while (p1 != null && p2 != null) { // 比较 p1 和 p2 两个指针 // 将值较小的的节点接到 p 指针

2021-09-16 10:41:13 259

转载 算法学习笔记:labuladong--BFS算法解题框架

BFS介绍BFS 的核心思想应该不难理解的,就是把一些问题抽象成图,从一个点开始,向四周开始扩散。一般来说,我们写 BFS 算法都是用「队列」这种数据结构,每次将一个节点周围的所有节点加入队列。BFS 相对 DFS 的最主要的区别是:BFS 找到的路径一定是最短的,但代价就是空间复杂度可能比 DFS 大很多一、BFS算法框架要说框架的话,我们先举例一下 BFS 出现的常见场景好吧,问题的本质就是让你在一幅「图」中找到从起点 start 到终点 target 的最近距离,这个例子听起来很枯燥,但是 B

2021-09-15 15:45:10 320

转载 算法学习笔记:labuladong--回溯算法解题框架

回溯算法介绍:回溯算法其实就是我们常说的 DFS 算法,本质上就是一种暴力穷举算法解决一个回溯问题,实际上就是一个决策树的遍历过程。你只需要思考 3 个问题:1、路径:也就是已经做出的选择。2、选择列表:也就是你当前可以做的选择。3、结束条件:也就是到达决策树底层,无法再做选择的条件。回溯算法的框架:result = []def backtrack(路径, 选择列表): if 满足结束条件: result.add(路径) return for

2021-09-15 11:56:30 655

转载 算法学习笔记:labuladong--动态规划解题框架

一、数据结构的存储方式数据结构的存储方式只有两种:数组(顺序存储)和链表(链式存储)。原因:散列表、栈、队列、堆、树、图都属于「上层建筑」,而数组和链表才是「结构基础」。这些多样化的数据结构,究其源头,都是在链表或者数组上的特殊操作,API 不同而已。数组 由于是紧凑连续存储,可以随机访问,通过索引快速找到对应元素,而且相对节约存储空间。但正因为连续存储,内存空间必须一次性分配够,所以说数组如果要扩容,需要重新分配一块更大的空间,再把数据全部复制过去,时间复杂度 O(N);而且你如果想在数组中间进行插

2021-09-14 16:59:11 488

原创 C++引用本质

2021-09-06 11:42:09 45

转载 C++编译器编译原理

什么是gcc?gcc是GNU Compiler Collection的缩写。最初是作为C语言的编译器(GNU C Compiler),现在已经支持多种语言了,如C、C++、Java、Pascal、Ada、COBOL语言等。gcc支持多种硬件平台,甚至对Don Knuth 设计的 MMIX 这类不常见的计算机都提供了完善的支持。gcc主要特征gcc是一个可移植的编译器,支持多种硬件平台gcc不仅仅是个本地编译器,它还能跨平台交叉编译。gcc有多种语言前端,用于解析不同的语言。gcc是按模块化设计

2021-08-31 16:09:37 237

转载 C++模板的实现机制

模板机制C++提供两种模板机制:函数模板、类模板类属----类型参数化,又称参数模板:使得程序或算法可以从逻辑功能上抽象,把被处理的对象类型或数据类型作为参数进行传递模板把函数或类要处理的数据类型参数化,表现为参数的多态性,称为类属。模板用于表达逻辑结构相同,但具体数据元素类型不同的数据对象的通用行为函数模板语法template <类型形式参数表>类型 函数名(形式参数表){}例如:template 告诉C++编译器我们要开始泛型编程了,看到T不要报错,它指得是一种数据类型

2021-08-31 16:05:18 1261

原创 C++函数重载的实现原理

编译器对函数进行重命名:“_” + 函数名----C语言中,“_Add”为编译器对函数“Add”的重新命名,故编译器无法区分相同函数名不同形参的情况下的函数,故不支持函数重载。“?” + 函数名 + “@@YA” + 形参 + “@Z”----C++语言中,?Add@@YAMMM@Z;“?” + 函数名 + “@” + 类名 + “@@QAE” + 形参 + “@Z”----C++的类函数命名规则;为什么函数命名规则中只针对了形参类型和个数,对返回值却没有要求呢?答:因为只有这样才能将函数的命名规

2021-08-31 15:28:25 170

原创 python的GIL锁

GIL:又叫全局解释器锁,每个线程在执行的过程中都需要先获取GIL,保证同一时刻只有一个线程在运行,目的是解决多线程同时竞争程序中的全局变量而出现的线程安全问题。它并不是python语言的特性,仅仅是由于历史的原因在CPython解释器中难以移除,因为python语言运行环境大部分默认在CPython解释器中。多线程下每个线程在执行的过程中都需要先获取GIL,保证同一时刻只有一个线程在运行。即使在多核CPU中,多线程同一时刻也只有一个线程在运行,这样不仅不能利用多核CPU的优势,反而由于每个线程在多个C

2021-08-31 14:30:19 208

原创 什么是知识图谱

历史产生背景:2012 年 5 月 17 日,Google 正式提出了知识图谱(Knowledge Graph)的概念,其初衷是为了优化搜索引擎返回的结果,增强用户搜索质量及体验。假设我们想知道 “王健林的儿子” 是谁,百度或谷歌一下,搜索引擎会准确返回王思聪的信息,说明搜索引擎理解了用户的意图,知道我们要找 “王思聪”,而不是仅仅返回关键词为 “王健林的儿子” 的网页:实际上,知识图谱并不是一个全新的概念,早在 2006 年就有文献提出了语义网(Semantic Network)的概念,呼吁推广、

2021-08-30 12:06:24 640

转载 CDN工作原理

内容分发网络(Content Delivery Network,简称CDN)是建立并覆盖在承载网之上,由分布在不同区域的边缘节点服务器群组成的分布式网络。CDN应用广泛,支持多种行业、多种场景内容加速,例如:图片小文件、大文件下载、视音频点播、直播流媒体、全站加速、安全加速。假设通过CDN加速的域名为www.a.com,接入CDN网络,开始使用加速服务后,当终端用户(北京)发起HTTP请求时,处理流程如下:当终端用户(北京)向www.a.com下的指定资源发起请求时,首先向LDNS(本地DNS)发起

2021-08-27 16:31:17 68

转载 shared_ptr和weak_ptr

shared_ptr:带引用计数的智能指针,自己会析构shared_ptr是带引用计数的智能指针,可以说大部分的情形选择用shared_ptr不会出问题。那么weak_ptr是什么,应该怎么用呢?weak_ptr也是智能指针,但是比较弱,感觉没什么用。其实它的出现是伴随shared_ptr而来,尤其是解决了一个引用计数导致的问题:在存在循环引用的时候会出现内存泄漏。关于循环引用,看下面这个小例子就足够了:#include <iostream>#include <boost/sma

2021-08-27 12:06:00 256

原创 日志易面经

1、线程同步的方式有哪些?互斥锁、条件变量、信号量、异步操作、 原子操作2、判断回文链表3、C++多态怎么理解多态性可以简单的概括为“1个接口,多种方法”,在程序运行的过程中才决定调用的机制程序实现上是这样,通过父类指针调用子类的函数,可以让父类指针有多种形态。当子类重写父类中的虚函数,子类虚表中的函数地址替换掉父类中的(cat的虚函数地址替换annimal的虚函数地址),当声明一个父类的指针或引用,指向子类对象的地址的时候,通过该对象调用虚函数(如果重写了就是子类的,没有重写就是父类的,以此

2021-08-26 15:59:24 544

原创 C++线程同步的方式

互斥锁互斥锁是用来防止多个线程同时访问共享资源对象的机制,在同一时间只有一个线程可以拥有一个特定的锁对象,其他线程如果尝试获取锁会阻塞直到锁资源被释放或直接返回失败。针对这道题我们可以用两个互斥锁来阻塞 second 和 third 函数,分别在 first 和 second 执行结束后解锁。条件变量条件变量一般和互斥锁搭配使用,互斥锁用于上锁,条件变量用于在多线程环境中等待特定事件发生。针对这道题我们可以分别在 first 和 second 执行完之后修改特定变量的值(例如修改成员变量 ..

2021-08-26 10:26:24 434

空空如也

空空如也

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

TA关注的人

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