自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 【项目】负载均衡OnlineJudge

所用技术开发环境实现类似于常见oj网站中的:题目列表+在线编程+判题 功能。服务需求:将用户提交的代码暂存在本地进行编译运行,得到格式化的结果返回。其中的构建路径函数Src,Exe,Stderr,查看文件是否存在函数IsFileExists,日志函数LOG等,都定义在 目录下的 和 中:log.hpp测试compile函数到目前为止我们的思路如下为了测试上述代码是否能正常运转,我预先在temp目录中存放了一段测试代码:compile_server.cc编译compile_server

2022-08-22 12:31:03 828 1

原创 【项目】 基于BOOST的站内搜索引擎

常见的搜索引擎:baidu、google、bing,以及常见的一些带有搜索功能的app等。我们自己单枪匹马实现一个常规的搜索引擎(全网搜索)显然是不可能的,但可以实现一个简单的搜索引擎来进行站内搜索的行为。比如我们学习C++常用的cplusplus网站就是带有站内搜索功能,搜索的内容更垂直(范围小且相关性更强),数据量更小。boost库是没有站内搜索的,我们可以自己做一个。完成后的搜索引擎也将显示每个检索条目的:网页标题,网页内容摘录以及url。技术栈:项目环境:Centos 7云服务器,vim/gcc(g

2022-08-10 15:22:49 1137 2

原创 【C++从入门到到踹门】第二十一篇:C++11

1. 统一列表初始化{} 初始化STL的 initializer_list 类2. 声明autodecltypenullptr3. C++11新增STL4. 右值引用与移动语义左值与右值左值引用与右值引用标准库 move 函数移动语义完美转发5. 类的默认成员函数与关键字 default 和 delete默认成员函数强制生成默认函数的关键字禁止生成默认函数的关键字delete6. lambda 表达式引入lambda 表达式仿函数类和lambda表...

2022-07-23 21:50:44 511

转载 如果在构造函数中抛出异常,最好的做法是防止内存泄漏?

如果在构造函数中抛出异常,析构函数将不会被调用(简单类,不继承).因此,如果在构造函数中抛出异常,并且有一些堆内存未被清除的机会.那么这里最好的做法是什么?如果你避免“裸”资源(如裸指针,裸互斥体等),并将所有内容都包含在具有适当RAII行为的容器或类中,那么即使存在异常,也不会有您所描述的问题.也就是说,不要在构造函数中获取裸资源.而是创建一个本身跟随RAII的对象的实例.这样,即使您的构造函数失败(即创建实例的构造函数),将调用初始化对象的析构函数.所以,这是不好的做法:输出:一个更正的例子:输出

2022-07-04 20:58:49 186

原创 【C++从入门到踹门】第二十篇:布隆过滤器

在使用新闻app看新闻时,一旦刷新就会为我们不停地推荐新的内容,他每次推荐时要去重,过滤掉哪些已经浏览过的内容。那么新闻客户端是如何去重的呢?服务器记录了用户看过的所有历史记录,当推荐系统推荐新闻时先对历史记录进行过滤,滤掉重复的内容。那么它又是如何进行快速查找的呢?我们可以想到如下的方法:布隆过滤器是一个大型位图(bit数组)+多个无偏哈希函数。一个bit数组:如果我们要映射一个值到布隆过滤器中,则需要使用多个不同的无偏哈希函数来生成多个哈希值,并对每个哈希值所指向的bit位置为1。无偏哈希函数就是能把元

2022-06-20 12:10:26 640

原创 【Linux网络】第三篇:套接字(二)与TCP编程

在 套接字(一)与UDP编程 中我们讲了套接字和UDP的一些知识及常用API,我们知道当系统有多个进程进行网络通信的时候,每个进程必须各自通过协议+端口+IP地址的方式才能确定网络对端的唯一进程。为了区别不同的应用程序以及进程的网络连接之间相互独立,Linux系统为应用程序和TCP/IP协议交互提供了称为套接字(Socket)的接口套接字是网络编程中十分重要的概念,Linux以文件的形式实现套接字,与套接字相应的文件属于sockfs特殊文件系统,每创建一个套接字,就是在sockfs中创建一个特殊文件,并建立

2022-06-16 16:17:15 866 8

原创 【C++从入门到踹门】第十九篇:bitset(位图)的使用与实现

常规的想法是将40亿个数存入数组中,快速排序然后采用二分法查找,时间复杂度O(NlogN).或者是将一堆数存入unordered_set容器中,使用find进行查找,时间复杂度为O(N)。但是内存空间存不下这么多的数字:40亿≈232=22 * 2^10 * 2^10 * 2^10=4 * 1024 * 1024 * 1024 = 4G每个整数占4字节,所以40亿个整数占用16G字节的空间而一台32位机的内存地址有32位,每个地址指向1字节(8bits)的数据,其内存地址空间的大小只有2^32=4G字节的空

2022-06-10 23:27:48 4817

原创 【Linux网络】第二篇:套接字(一)与UDP编程

每台计算机的公网IP是唯一的,如果本地主机和对端主机要实现通信,那么对端主机的IP地址将作为该数据传输的目的IP地址。仅仅知道目的IP地址是不够的,当对端主机接受数据后需对该主机做出响应,于是对端主机就需要知道本地主机的IP地址,即源IP。大部分网络服务使跨局域网的,期间会跳到多个路由器最终达到目的主机。开始传输时的源MAC地址是本地主机的MAC,目的MAC是下一跳的路由器MAC。最后一跳的源MAC则是最后途径的路由器的MAC,目的MAC是对端主机的MAC。因此数据的网络地址是有两套地址的:一个端口号唯一标

2022-06-09 17:16:59 608 7

原创 【C++从入门到踹门】第十八篇(下):使用哈希表封装unorder_map和unordered_set

unorder_set是K模型的容器,unorder_map是KV模型的容器要想使用哈希表同时适配K模型和KV模型,就只能对哈希表的模板参数给出控制。同时unorder_set 和 unorder_map 需要给出解析key的仿函数KeyOfValue框架如下:哈希表 HashTable 的基本框架:其中find,insert,erase函数已在上篇中实现,这里还需略作修改unordered_map 基本框架unordered_set 基本框架一个类型做map/set的Key的要求,能支持

2022-06-06 20:28:02 330 2

原创 【Linux网络】第一篇:初识网络(分层,封装与分用)

现在的Internet使用的主流协议族是TCP/IP协议族,,他是一个分层,多协议的通信体系。TCP/IP包含众多协议,我们无法一一讨论,我会在后续章节逐步介绍,本篇将对协议如何分层,封装和分用进行介绍。网络协议栈设计成层状结构,目的在于将一个实时传输通信的庞大的功能进行解耦,使得各层能做到各自可维护以及可扩展。例如,我们在通话时,符合人与人之间的语言协议,这使得我们可以彼此进行沟通,但是下一层电话之间的通信协议是如何约定的,再往下的电信号是如何传输的,以及经过了多少基站,我们并不关心,当然电话也听不懂人类

2022-06-05 20:32:15 515 6

原创 【C++从入门到踹门】第十八篇(上):哈希表实现

哈希概念什么是哈希表直观了解哈希哈希冲突哈希函数哈希冲突处理闭散列 —— 开放定址法哈希表开散列哈希表闭散列实现Hash仿函数哈希表基本框架查找函数——find插入元素——insert删除函数——erase哈希表开散列实现基础结构查找元素 —— find插入元素 —— insert删除元素 —— erase如何设置哈希表的大小(拓展)......

2022-06-03 16:09:40 926 2

原创 【C++从入门到踹门】第十七篇(下):map与set实现

目录基本框架红黑树仿函数 KeyofValue红黑树迭代器operator* 和 operator->operator== 和 operator!=operator++ 和 operator--反向迭代器封装成map和set的迭代器完善类功能插入结点——insert函数下标访问——operator[]函数删除结点——erase函数完整代码基本框架红黑树是map和set的底层数据结构,红黑树的代码实现戳红黑树实现现在要用红黑树封装出map和set两个容器,过程中需要对红黑树略加修改,读者可以打开

2022-05-31 11:31:00 194 1

原创 【C++从入门到踹门】第十七篇(上):红黑树的实现

目录1.红黑树的概念2.红黑树结点定义3.红黑树结构4.红黑树的插入操作5.红黑树的验证遍历平衡性6.红黑树的删除7.红黑树与AVL树1.红黑树的概念红黑树首先是一棵二叉搜索树,但在每个结点包含一个颜色信息(Red or Black)。通过对任何一条根到叶子的路径上各个结点着色的限制,红黑树可以确保根到各个叶子结点的最长路径最多是最短路径的两倍——近似平衡。相较于AVL树虽然达不到完全平衡,如搜索10亿个数据,AVL数需搜索30次(2^30),而红黑树可能最多需要搜索60次(这对于CPU而言没有区别)

2022-05-29 12:03:50 588 13

原创 【Linux】第十三篇:线程池与单例模式

1.线程池介绍一个基于简单任务的线程池实现2.线程池与单例模式饿汉模式与懒汉模式懒汉模式的线程池3.读写锁读写锁接口设置读者写者优先级读写锁API读写锁实验4.自旋锁简介

2022-05-26 13:04:04 1020

原创 【Linux】第十二篇:生产者消费者模型与信号量

1. 生产者消费者模型为何使用生产者消费者模型模型特点2. 基于 BlockingQueue 的生产消费者模型模拟实现基于阻塞队列的生产消费模型基于任务队列的生产者消费者模型3. POSIX信号量(Semaphore)信号量使用信号量的接口函数sem_init —— 初始化信号量sem_destroy —— 销毁信号量sem_wait —— 等待信号量sem_post —— 发布信号量信号量使用入门4. 基于环形队列的生产者消费者模型环形队列的资源实现思想使用信号量实现基于

2022-05-26 12:56:48 803

原创 【Linux】第十一篇:线程安全(互斥锁,死锁,条件变量)

概念1. 互斥量(mutex)🔒互斥量的接口初始化互斥量互斥量加锁与解锁销毁互斥量互斥量实验2. 互斥量原理3. 线程安全与可重入函数判定线程安全的情形判断函数是否可重入两者关联4. 死锁构成死锁的四个必要条件如何避免死锁模拟死锁以及gdb调试5. 线程同步条件变量初始化与销毁 —— pthread_cond_init ,pthread_cond_init条件变量的等待与唤醒何为条件变量设计 pthread_cond_wait 的初衷pthread_cond_wa

2022-05-26 12:49:12 984

原创 【Linux】第十篇:线程的创建,等待,终止与分离

目录1.线程理解线程与进程线程的特点线程异常Linux线程控制2.创建进程 —— pthread_create获取线程ID —— pthread_self代码示例实验1实验2实验33.进程ID和线程ID4.终止线程等待线程 —— pthread_join线程退出 return线程退出 pthread_exit实验线程退出 pthread_cancel取消点库函数 pthread_setcancelstate : 修改cancelstate库函数 pthread_setcanceltype : 修改cance

2022-05-26 12:37:24 684

原创 【Linux】第八篇:进程信号

1. 信号入门进程中的信号前后台进程处理Linux系统中的信号信号的产生与处理简介产生信号的条件信号的处理动作注册信号处理函数 —— signal 系统调用注册信号处理函数 —— sigaction 系统调用2. 产生信号通过终端按键产生信号Core Dump调试core文件status 中的 core dump 位调用系统函数向进程发信号kill 函数raise 函数abort 函数由软件条件产生信号3. 阻塞信号信号的相关概念信号在内核中的表示sigset_t

2022-05-26 12:26:34 866

原创 【C++从入门到踹门】第十六篇:AVL树

1.AVL树的概念2. AVL树的插入3.AVL树的旋转(出现不平衡子树)单旋转左单旋右单旋双旋转右左双旋左右双旋4.AVL树的验证5.AVL树的查找6.AVL树的删除7.AVL树的键值访问及修改

2022-05-26 11:46:11 135

原创 【C++从入门到踹门】第十五篇:set 和 map

关联式容器键值对setset的使用multisetset 应用举例mapmap的使用multimapmap的应用举例

2022-05-26 11:25:15 394

原创 【C++从入门到踹门】第十四篇:二叉搜索树

目录二叉搜索树的概念操作与实现二叉搜索树二叉搜索树的拷贝构造,赋值重载,析构函数二叉搜索树的查找二叉搜索树的插入二叉搜索树的删除应用性能分析二叉搜索树的概念以递归的方式来定义二叉搜索树:若它的左子树不为空,那么它左子树上所有结点的值都小于根节点的值。若它的右子树不为空,那么它右子树上所有结点的值都大于根结点的值。它的左右子树也为二叉搜索树。操作与实现二叉树结点的结构体:template<class K>struct BSTreeNode{ BSTreeNode&lt

2022-05-26 11:05:31 124

原创 【Linux】第五篇:IO(初阶)

1. C语言文件流操作2. 系统 I/O 接口openwriteread3. 文件描述符fdstruct file 描述已打开的文件struct files_struct 结构文件描述符的分配规则重定向dup2 系统调用4. 文件缓冲标

2022-04-26 11:14:25 912 4

原创 【Linux】第七篇:进程间通信

1. 进程间通信(IPC:interprocess communication)理解目的分类2. 管道匿名管道站在文件描述符角度理解管道创建匿名管道函数 —— pipe管道的四个读写规则匿名管道的特点命名管道命令行创建命名管道系统调用创建命名管道命名管道应用实例命名管道派发任务命名管道与匿名管道的区别3. 共享内存shmget 系统调用——创建共享内存ipcs 指令ipcrm 指令shmctl 系统调用——控制共享内存shmat 系统调用——挂接共享内存(attac

2022-04-26 10:51:52 687 4

原创 【Linux】第六篇:静动态库文件的理解及实现

基本概念库的命名安装c静态库指令静态库的打包与使用静态库打包调用静态库动态库的打包与使用动态库打包动态库调用

2022-04-25 23:15:02 1082 2

原创 【C++从入门到踹门】第十三篇:多态

1.多态概念2.多态实现2.1 构成多态的条件2.2 虚函数的重写虚函数重写特例2.3 虚函数性质2.4 override 、final (C++11)2.5 重载、覆盖(重写)、隐藏(重定义)的区别3.抽象类3.1 抽象类的概念3.2 接口继承和实现继承4.多态的原理4.1 虚函数表4.2 多态原理4.3 动态绑定与静态绑定5.单继承与多继承的虚函数表5.1 单继承虚函数表5.2 多继承虚函数表5.3 打印虚表中的虚函数地址5.3 菱形虚拟继承6.继承与多态常见问题

2022-04-25 21:06:40 1504 6

原创 【C++从入门到踹门】第十二篇:继承

目录1.继承的概念概念继承的定义继承格式继承关系与访问限定符的组合关系父类与子类的赋值转换2. 继承的作用域3. 子类的默认成员函数什么时候需要自己写默认成员函数?4. 继承与友元5. 继承与静态成员6. 继承方式(菱形继承,虚拟继承)虚拟继承7. 继承的总结1.继承的概念概念之前谈到过的函数模板与类模板都是为了能够使代码复用起来,继承机制是面向类设计的复用手段,它允许程序员在保有原有类特性的基础上进行扩展,在其上增加功能,这样产生的类便不用再写冗余代码了。先写个父类:class Person

2022-04-15 13:01:35 1140

原创 【C++从入门到踹门】第十篇:stack,queue,priority_queue实现

目录stack的实现了解deque实现stackqueue的实现deque 的优势priority_queue的实现heap 堆heap 算法加入新元素删除堆顶元素实现简单 priority_queue仿函数less 仿函数greater 仿函数priority_queue 的实现代码全貌stack的实现stack 的本质是一个容器适配器。适配器是一种机制,通过修改已有容器的接口来形成我自己的风格。一个容器适配器接受一种已有的容器类型,使其行为看起来像一种不同的类型。观察stack的模板

2022-04-02 16:22:58 1500 1

原创 【Linux】第四篇:进程控制

目录1.程序地址空间测试父子进程的地址空间虚拟进程地址空间虚拟地址的由来mm_struct页表2.进程创建fork函数再探fork的返回值写时拷贝fork 的用处fork调用失败3.进程终止进程的退出场景进程常见退出方法exit 函数_exit 函数4.进程等待为何需要等待进程如何进程等待waitwaitpid获取 statusoption:WNOHANG总结5.进程替换替换原理替换函数6.自制简易 shell1.程序地址空间程序是由若干个逻辑分段组成的,如可由代码分段、数据分段、栈段、堆段组成。

2022-04-02 16:09:05 1320

原创 中缀表达式转后缀表达式,以及后缀表达式的计算

目录中缀转后缀表达式逻辑代码演示后缀表达式计算逻辑代码演示先上题目链接牛客:中缀转后缀leetcode:后缀表达式计算中缀转后缀表达式准备三个容器:vector<string> ret 存放最后结果stack<char> symbol 运算符暂时存放map<char,int> P 存放符号优先级逻辑开始遍历中缀字符串:遇到 数字 直接存放入于输出数组 ret遇到操作符symbol栈为空 或者 当前操作符为(,直接入栈栈不为

2022-03-26 00:12:03 1227

原创 【Linux】第三篇:进程

这里写目录标题1. 简述操作系统概念为什么需要操作系统何为资源管理操作系统的目标2.进程描述进程-PCBtask_structLinux 查看当前进程进程标识符-PID系统调用创建子进程——初识fork()3. 进程状态基本概念其他概念Linux 进程状态R 运行态+就绪态S 休眠状态(可中断睡眠) ,阻塞D 深度睡眠状态T 暂停状态t 追踪状态X 死亡状态Z(僵尸状态)孤儿进程进程优先级查看进程PRI 与 NI调整进程优先级top 指令renice 指令4. 环境变量环境变量基本概念常用环境变量echo

2022-03-19 00:11:57 1760

原创 【Linux】第二篇:Linux环境及开发工具

目录1. Linux软件包管理器1.1 如何在Linux安装软件?1.2 关于rzsz2.Linux 文本编辑器——vim2.1 vim的模式2.2 vim的基本操作2.3 命令模式下指令集基本移动文本操作2.4 底行模式命令2.5 vim的配置配置文件的位置常用的配置选项2.6 使用vim给用户添加sudo权限命令总览3 Linux编译器——gcc/g++使用3.1 代码生成可执行文件的步骤3.2 使用gccgcc分别完成预处理、编译、汇编、链接预处理 ◔编译 ◑汇编 ◕链接 ◉4. Linux调试器——

2022-03-18 23:57:49 6300

原创 【C++从入门到踹门】 第九篇:list的实现

目录list的实现简单造个轮子(版本:1.0)🚩迭代器🚩list的迭代器 iterator🚩const_iterator针对const对象的迭代器合并两个迭代器版本 2.0🚩造一个好用的轮子(版本3.0)构造函数拷贝构造赋值运算符重载clear 函数insert 函数earse 函数push_front pop_back pop_front 函数🚩反向迭代器 (版本4.0)代码全貌list的实现简单造个轮子(版本:1.0)list在STL中的结构是一个带头双向链表,首先创建结点结构体作为链表单元:

2022-03-18 23:49:39 1299

原创 【C++从入门到踹门】 第八篇:vector的实现

STL模拟实现 ☞ vector

2022-03-18 23:42:26 1049

原创 【C++从入门到踹门】 第七篇:模拟string

目录string的使用默认成员函数构造函数拷贝构造函数赋值重载函数析构函数迭代器相关函数begin和end 以及 rbegin和rend容量管理相关函数size 、 capacityreserve 、 resizeclear 、 empty寻找与访问字串相关函数operator[]c_strfindrfind修改字串函数push_backappend+=pop_backinserterase关系运算符重载流运算符重载string的使用首先熟悉string的使用,可以参考string使用手册stri

2022-03-04 14:50:34 549

原创 “指针常量引用” , int const*,const int* ,const int*& ,int* const&区别详解

“指针常量引用” , int const*,const int* ,const int*& ,int* const&区别详解

2022-02-23 11:59:42 2394

原创 【C++从入门到踹门】第五篇:new与delete

目录1. C/C++的内存分布2. C++的内存管理方式2.1 new和delete操作内置类型2.2 new和delete操作自定义类型4.operator new 和operator delete函数4.1 ``new`` 和 ``operator new``4.2 operator new的三种重载形式4.3 operator delete5.new和delete的实现原理5.1 内置类型5.2 自定义类型6 operator new /operator delete的类专属重载 与 定位new(

2022-02-20 10:56:22 723

原创 【Linux 从入门到精通】第一篇 常见指令及初识权限

常用指令 以及文件权限

2022-02-18 22:07:06 804

原创 【C++从入门到踹门】第四篇:类和对象(下)

目录1.再探构造函数——初始化方式1.1 构造函数体内赋初值1.2 初始化列表1.3 explicit关键字1.4 匿名对象2. static 成员2.1 概念2.2 使用特性3. C++11的初始化4.友元4.1 友元函数4.1.1 全局函数作为友元函数4.1.2 成员函数作为友元函数4.1.3 友元函数的说明:4.2 友元类4.2.1 友元类举例4.2.2 成员函数作为友元函数5. 内部类5.1 概念1.再探构造函数——初始化方式1.1 构造函数体内赋初值创建对象时,在调用的函数体内为对象的成

2022-02-18 19:41:35 556

原创 日期类的实现

日期类头文件 (Date.h)源文件(Date.cpp)构造函数日期+=天数日期相加日期-=天数日期的相减日期的前后比较两个日期的相减日期的前置后置的 ++ --利用前置++,重写日期相减头文件 (Date.h)#pragma once#include <iostream>#include <assert.h>#include <stdbool.h>using std::cout;using std::cin;using std::endl;cl

2022-02-11 16:47:40 416

原创 无符号数的加减运算

无符号数加减

2021-12-28 11:36:37 11290 2

空空如也

空空如也

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

TA关注的人

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