- 博客(69)
- 收藏
- 关注
原创 C++智能指针
文章目录智能指针的使用及原理RAII智能指针的原理std::auto_ptr智能指针的使用及原理为什么需要智能指针?以malloc和free为例:malloc出来的空间,没有进行释放,存在内存泄漏的问题。异常安全问题。如果在malloc和free之间如果存在抛异常,那么还是有内存泄漏。这种问题就叫异常安全。RAIIRAII(Resource Acquisition Is Initialization)是一种利用对象生命周期来控制程序资源(如内存、文件句柄、网络连接、互斥量等等)的简单技
2022-11-11 00:37:55
621
原创 HTTP/HTTPS
协议是一种 “约定”. socket api的接口, 在读写数据时, 都是按 “字符串” 的方式来发送接收的. 如果我们要传输一些"结构化的数据" 怎么办呢?网络版计算器例如, 我们需要实现一个服务器版的加法器. 我们需要客户端把要计算的两个加数发过去, 然后由服务器进行计算, 最后再把结果返回给客户端约定方案一:客户端发送一个形如"1+1"的字符串;这个字符串中有两个操作数, 都是整形;两个数字之间会有一个字符是运算符, 运算符只能是 +;数字和运算符之间没有空格;…约定方案二:
2022-04-09 14:53:29
2758
原创 C++实现高并发内存池
文章目录完整代码项目介绍内存池开胃菜--先设计一个定长的内存池高并发内存池整体框架设计thread cachecentral cachepage cache回收、释放tcmalloc源码中实现基数树进行优化完整代码代码链接项目介绍当前项目是实现一个高并发的内存池,他的原型是google的一个开源项目tcmalloc,tcmalloc全称Thread-Caching Malloc,即线程缓存的malloc,实现了高效的多线程内存管理,用于替代系统的内存分配相关的函数(malloc、free)。这个项
2022-03-21 01:14:03
2760
3
原创 单例模式(C++)
文章目录不能被拷贝的类只能在堆上创建对象的类只能在栈上创建对象的类不能被继承的类只能创建一个对象的类(单例模式)单例模式饿汉模式懒汉模式不能被拷贝的类拷贝只会放生在两个场景中:拷贝构造函数以及赋值运算符重载,因此想要让一个类禁止拷贝,只需让该类不能调用拷贝构造函数以及赋值运算符重载即可。C++98将拷贝构造函数与赋值运算符重载只声明不定义,并且将其访问权限设置为私有即可。class CopyBan{ //...private: CopyBan(const CopyBan&);
2022-03-14 16:55:52
205
10
原创 Linux-线程
文章目录操作创建线程创建进程,我们从0到有创建了很多东西,申请了很多资源。进程:承担分配系统资源的基本实体。线程:调度的基本单位,线程是进程里面的执行流(线程在进程的地址空间内运行)。进程:线程 = 1:nLinux中,没有真正意义上的线程,线程是用进程模拟的(轻量级进程)。只有第一个进程执行时创建了地址空间等资源,其它进程都只是分享了同一个资源。显然分配资源比申请资源快。在一个程序里的一个执行路线就叫做线程(thread)。更准确的定义是:线程是“一个进程内部的控制序列””一切进程
2022-03-14 09:50:57
1134
10
原创 哈希(C++)
文章目录unordered系列关联式容器unordered_mapunordered_set底层结构哈希概念哈希冲突哈希函数(常见)哈希冲突解决闭散列开散列(哈希桶)unordered系列关联式容器在C++98中,STL提供了底层为红黑树结构的一系列关联式容器,在查询时效率可达到,即最差情况下需要比较红黑树的高度次,当树中的节点非常多时,查询效率也不理想。最好的查询是,进行很少的比较次数就能够将元素找到,因此在C++11中,STL又提供了4个unordered系列的关联式容器,这四个容器与红黑树结构的
2022-03-07 21:49:27
890
23
原创 Linux-进程间通信
文章目录管道匿名管道命名管道进程间通信的本质:让不同的进程,能看到同一份系统资源(系统通过某种方式提供的系统内存)。系统提供的方式是有差别的,决定了通信策略是有差异的。进程间通信目的:数据传输:一个进程需要将它的数据发送给另一个进程资源共享:多个进程之间共享同样的资源通知时间:一个进程需要向另一个或一组进程发送消息,通知它(他们)发生了某种事件(如进程终止时要通知父进程)。进程控制:有些进程希望完全控制另一个进程的执行(如Debug进程),此时控制进程希望能够拦截另一个进程的所有陷入和异常,
2022-03-04 20:39:49
953
25
原创 红黑树(C++)
文章目录红黑树红黑树的概念红黑树的性质红黑树结点的定义红黑树的插入操作情况一情况二情况三红黑树的验证用红黑树封装map、set红黑树的迭代器封装map封装set红黑树红黑树的概念红黑树的概念 红黑树,是一种二叉搜索树,但在每个结点上增加一个存储位表示结点的颜色,可以是Red或Black。 通过对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路径会比其他路径长出俩倍,因而是接近平衡的。红黑树和AVL树都是高效的平衡二叉树,增删改查的时间复杂度都是O(),红黑树不追求绝对平衡,
2022-02-27 23:33:59
3837
34
原创 Linux-基础IO
文章目录C文件接口系统文件I/OFILE *系统接口介绍open的返回值重定向dup2磁盘上的文件系统磁盘输入/输出(I/O)是在主存和外部设备(如磁盘驱动器、终端和网络)之间拷贝数据的过程。输入操作是从I/O设备拷贝数据到主存,而输出操作是从主存拷贝数据到I/O设备C文件接口写文件:#include <stdio.h> #include <string.h> int main() { FILE *fp = fopen("
2022-02-25 15:42:38
756
15
原创 set、map及AVL树
文章目录关联式容器树型结构的关联式容器键值对setmapinsertoperator[]multisetmultimap前K个高频单词AVL树概念节点的定义插入旋转右单旋左单旋左右双旋右左双旋AVL树的验证关联式容器序列式容器如vector、list、deque、forward_list(C++11)等,其底层为线性序列的数据结构,里面存储的是元素本身。关联式容器:里面存储的是<key, value>结构的键值对,再数据检索时比序列式容器效率更高。树型结构的关联式容器根据应用场景的不
2022-02-23 23:45:40
719
13
原创 飞行棋(C#)
文章目录效果展示主函数场景类型枚举控制台基础设置开始及结束场景逻辑游戏场景逻辑固定打印的信息格子类型枚举和格子结构体地图结构体玩家和电脑结构体绘制玩家扔骰子逻辑效果展示主函数 static void Main(string[] args) { int w = 50; int h = 30; ConsoleInit(w, h); E_SceneType nowSceneTy
2022-02-06 18:23:22
3741
18
原创 二叉搜索树(C++)
文章目录二叉搜索树概念与操作二叉搜索树的概念二叉搜索树的操作查找插入删除二叉搜索树的应用二叉树的性能分析二叉搜索树概念与操作二叉搜索树的概念二叉搜索树又称二叉排序树,若它的左子树不为空,则左子树上所有节点的值都小于根节点的值;若它的右子树不为空,则右子树上所有节点的值都大于根节点的值,它的左右子树也分别未二叉搜索树。也可以是一颗空树。int a[] = { 5, 3, 4, 1, 7, 8, 2, 6, 0, 9 };二叉搜索树的操作查找迭代: Node* Find(const K&am
2022-01-27 20:57:20
2550
22
原创 C++ 多态
文章目录多态的定义及实现多态的构成条件虚函数重写C++11的override和final抽象类多态的原理虚函数表动态绑定与静态绑定单继承和多继承关系的虚函数表单继承中的虚函数表多继承中的虚函数表常见问题多态的定义及实现多态的概念:通俗来说,就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会产生出不同的状态。比如买票这个行为,当普通人买票时,是全价买票;学生买票时,是半价买票;军人买票时是优先买票。多态的构成条件多态是在不同继承关系的类对象,去调用同一函数,产生了不同的行为。比如S
2022-01-25 19:01:15
1358
17
原创 Linux-进程控制
文章目录进程创建fock函数写时拷贝进程终止进程等待进程程序替换进程创建操作系统允许一个进程创建另一个进程,并且允许子进程继承父进程所拥有的资源,当子进程被终止时,其在父进程处继承的资源应当还给父进程。同时,终止父进程同时也会终止其所有子进程。注意:Linux操作系统对于终止有子进程的父进程,会把子进程交给1号进程接管。进程创建:1、命令行启动命令(程序、指令等) 2、通过程序自身,fork出子进程创建进程的过程:操作系统为新进程分配一个唯一的进程标识号,并申请一个空白的PCB,PCB是有
2022-01-17 21:54:15
2863
29
原创 算法练习1
文章目录复数乘法一年中的第几天k个一组翻转链表递增子序列复数乘法问题描述:输入两个表示复数的字符串,输出它们相乘的结果的字符串复数字符串用a+bi表示(a, b 为整数, i为虚数单位,i2=1)输入例子:1±2i3+4i输出例子:11±2i例子说明:(1±2i)(3+4i) = (3 + 4i - 6i - 8i * i) = 11±2i#include<iostream>#include<string>#include<vector>
2022-01-15 01:05:20
498
原创 回溯算法之广度优先搜索
文章目录迷宫问腿N叉树的层序遍历腐烂的橘子单词接龙打开转盘锁迷宫问腿假设有一个迷宫,里面有障碍物,迷宫用二维矩阵表示,标记为0的地方表示可以通过,标记为1的地方表示障碍物,不能通过。现在给一个迷宫出口,让你判断是否可以从入口进来之后,走出迷宫,每次可以向任意方向走。代码实现:namespace BFS { struct pair { int _x; int _y; pair(int x, int y) :_x(x) , _y(y) {} }; bool map
2022-01-13 01:40:32
997
14
原创 回溯算法--深度优先搜索
文章目录扑克牌全排列员工的重要性图像渲染被围绕的区域岛屿数量电话号码的字母组合组合总数活字印书N皇后扑克牌全排列假如有编号为1~ 3的3张扑克牌和编号为1~3的3个盒子,现在需要将3张牌分别放到3个盒子中去,且每个盒子只能放一张牌,一共有多少种不同的放法。解题思路:假定按照牌面值从小到大依次尝试,即将1号牌放入第一个盒子中。按此顺序继续向后走,放完第三个盒子时,手中的牌也已经用完,再继续往后则到了盒子的尽头。此时一种放法已经完成了,即这条路走到了尽头,需要折返,重新回到上一个盒子。这里回到第三个盒子,
2022-01-11 14:50:17
877
15
原创 贪心算法典例
文章目录选择排序平衡字符串买股票的最佳时机跳跃游戏钱币找零多机调度问题活动选择无重叠区间选择排序我们熟知的选择排序,其采用的就是贪心策略。它所采用的贪心策略即为每次从未排序的数据中选取最小值,并把最小值放在未排序数据的起始位置,直到未排序的数据为0,则结束排序。void swap(int* arr, int i, int j){ int tmp = arr[i]; arr[i] = arr[j]; arr[j] = tmp;}void selectSort(int* arr, int
2022-01-09 17:36:27
4599
24
原创 动态规划问题(2)
文章目录背包问题分割回文串编辑距离不同子序列背包问题问题描述:有 n 个物品和一个大小为 m 的背包. 给定数组 A 表示每个物品的大小和数组 V 表示每个物品的价值.问最多能装入背包的总价值是多大?A[i], V[i], n, m 均为整数你不能将物品进行切分你所挑选的要装入背包的物品的总大小不能超过 m每个物品只能取一次m <= 1000m<=1000len(A),len(V)<=100len(A),len(V)<=100解题思路:1.状态:F(i,j
2022-01-08 17:15:07
1011
19
原创 动态规划问题
文章目录Fibonacci字符串分割(Word Break)三角矩阵(Triangle)路径总数(Unique Paths)最小路径和(Minimum Path Sum)Fibonacci题目描述:大家都知道斐波那契数列,现在要求输入一个正整数 n ,请你输出斐波那契数列的第 n 项。解题思路:1.递归2.动态规划状态:F(n)状态递推:F(n)=F(n-1)+F(n-2)初始值:F(1)=F(2)=1返回结果:F(N)代码实现:法一:递归(效率低):class Solutio
2022-01-05 23:53:20
423
原创 二叉树相关练习(1)
文章目录重建二叉树判断树的子结构二叉树的镜像二叉树的层序遍历二叉树的后序遍历序列二叉树中和为某一值的路径二叉树深度的判定按之字型打印二叉树二叉搜索树中第k小的元素重建二叉树题目描述:给定节点数为 n 二叉树的前序遍历和中序遍历结果,请重建出该二叉树并返回它的头结点。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建出如下图所示。解题思路:根据root节点,将中序vector划分成vin_left,vin_right两部分中序子序列
2021-12-26 00:47:50
422
原创 计算机图形学笔记1.变换
向量 VectorsDot productCross productOrthonormal bases and coordinate framesDot productDot Product in GraphicsFind angle between two vectors (e.g. cosine of angle between light source and surface)Finding projection of one vector on another1.向
2021-12-13 22:07:53
1727
原创 C++模板(2)
文章目录非类型模板参数模板的特化函数模板特化类模板特化模板分离编译模板总结非类型模板参数模板参数分为类型形参和非类型形参类型形参:出现在模板参数列表中,跟在class或typename之类的参数类型名称后。非类型形参:用一个常量作为类(函数)模板的一个参数,在类(函数)模板中可将该参数当成常量来使用。C++11提供了一个叫array的容器,和vector相似,但vector插入数据不需要考虑空间大小,不够了就扩容。而array是静态数组,是固定大小的,它用了一个非类型模板参数来控制大小。它没有头插
2021-12-01 00:03:32
120
原创 Linux--进程概念
文章目录冯诺依曼体系结构操作系统概念系统调用和库函数进程进程描述-PCB通过系统调用创建进程-fork初识进程状态冯诺依曼体系结构我们常见的计算机,如笔记本。我们不常见的计算机,如服务器,大部分都遵守冯诺依曼体系。冯诺依曼规定了硬件层面上的数据流向。可执行程序运行的时候必须先加载到内存,存储器(物理内存)相当于cpu和所有外设的缓存截至目前,我们所认识的计算机,都是有一个个的硬件组件组成输入单元:包括键盘, 鼠标,扫描仪, 写板等中央处理器(CPU):含有运算器和控制器等输出单元:显示器,
2021-11-29 23:12:00
650
原创 C++ stack和queue
文章目录stack介绍和使用模拟实现stack的使用例题最小栈栈的弹出压入序列逆波兰表达式求值queue模拟实现容器适配器STL标准库中stack和queue的底层结构stack介绍和使用stack文档介绍stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行元素的插入与提取操作。stack是作为容器适配器被实现的,容器适配器即是对特定类封装作为其底层的容器,并提供一组特定的成员函数来访问其元素,将特定类作为其底层的,元素特定容器的尾部(即栈顶)被压入和弹
2021-11-25 18:19:18
796
原创 算法入门day1(数组)
文章目录二维数组中的查找旋转数组的最小数字调整数组位置使奇数位于偶数前面数组中出现次数超过一半的数字二维数组中的查找题目描述:在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。如以下二维数组:1 2 3 42 3 4 53 4 5 6解题思路: 查找的本质是排除。根据这个二维数组的特性,可以选取右上角或者左下角的数字作为标准,假设选择右上角数字,如果目
2021-11-24 22:43:25
282
原创 C++ list
文章目录list的介绍总览list迭代器list的使用及模拟构造、析构函数list iteratorlist capacitylist element accesslist modifiers测试list的介绍list的文档介绍list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。list的底层是双向带头链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后一个元素。list与forward_list非常相似:最主要的不
2021-11-22 00:05:43
944
原创 Linux环境基础开发工具的使用
文章目录Linux软件包管理器yum软件包查看软件包安装软件卸载软件Linux编辑器-vim使用vim的基本概念vim的基本操作vim正常模式命令集vim末行模式命令集简单vim配置Linux编译器-gcc/g++使用Linux软件包管理器yum软件包安装软件一般有三种方法:1.源码2.rpm包。有点像windows下载的安装包3.yum命令行在Linux下安装软件, 一个通常的办法是下载到程序的源代码, 并进行编译, 得到可执行程序.但是这样太麻烦了, 于是有些人把一些常用的软件提前编译好,
2021-11-20 23:31:49
8410
1
原创 C++ vector
文章目录vector的介绍及使用vector的介绍vector的使用:vector的定义vector iterator的使用vector空间增长问题vector增删查改典型例题只出现一次的数字杨辉三角OJvector的介绍及使用vector的介绍vector的文档介绍vector是表示可变大小数组的序列容器。就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问,和数组一样高效。但是又不像数组,它的大小是可以动态改变的,而且它的大小会被容
2021-11-17 16:50:28
1224
4
原创 Linux-权限管理
文章目录shell命令以及运行原理Linux权限的概念Linux权限管理文件访问者的分类(人)文件类型和访问权限(事物属性)文件类型基本权限文件访问权限的相关设置方法目录的权限粘滞位shell命令以及运行原理Linux严格意义上说的是一个操作系统,我们称之为“核心(kernel)“ ,但我们一般用户,不能直接使用kernel。而是通过kernel的“外壳”程序,也就是所谓的shell,来与kernel沟通。如何理解?为什么不能直接使用kernel?从技术角度,Shell的最简单定义:命令行解释器(co
2021-11-15 20:43:27
1673
2
原创 C++ string类
文章目录标准库中的string类string类对象的容量操作string类对象的访问及遍历操作string类对象的修改操作string类非成员函数标准库中的string类string类文档链接字符串是表示字符序列的类。标准的字符串类提供了对此类对象的支持,其接口类似于标准字符容器的接口,但添加了专门用于操作单字节字符字符串的设计特性。string类是使用char(即作为它的字符类型,使用它的默认char_traits和分配器类型(关于模板的更多信息,请参basic_string)。string
2021-11-14 00:23:33
323
原创 C++模板简介
文章目录泛型编程函数模板概念函数模板的原理函数模板的实例化模板参数的匹配原则类模板类模板的定义格式类模板的实例化泛型编程实现一个交换函数:void Swap(int& left, int& right) { int temp = left; left = right; right = temp; }void Swap(double& left, double& right) { double temp = left; le
2021-11-10 14:50:55
103
1
原创 C/C++内存管理
文章目录C/C++内存分布C语言中动态内存管理方式C++内存管理方式new/delete操作内置类型new和delete操作自定义类型operator new与operator delete函数new和delete的实现原理内置类型自定义类型定位new表达式(placement-new)内存泄漏如何一次在堆上申请4G的内存C/C++内存分布我们先来看下面的一段代码和相关问题int globalVar = 1;static int staticGlobalVar = 1;void Test(){
2021-11-09 23:49:53
125
2
原创 C++类和对象(3)
文章目录再谈构造函数初始化列表explicit关键字static成员再谈构造函数初始化列表class A{public: A(int a = 0) { _a = a; } A& operator=(const A& aa) { if (this != &aa) { _a = aa._a; } return *this; }private: int _a;};class B{public: B(int a, int b
2021-11-08 23:48:25
114
原创 C++类和对象(2)
类的6个默认成员函数如果一个类中什么成员都没有,简称为空类。空类中什么都没有吗?并不是的,任何一个类在我们不写的情况下,都会自动生成下面6个默认成员函数。文章目录构造函数概念特性析构函数概念特性拷贝构造函数概念特征构造函数概念对于以下的日期类:class Date{public: void Init(int year, int month, int day) { _year = year; _month = month; _day = day; } void Prin
2021-11-06 00:46:46
226
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人