自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 二叉树前中后序遍历之迭代算法之最强统一风格

前序遍历: vector<int> preorderTraversal(TreeNode* root) { if(!root) return {}; vector<int> result; stack<TreeNode*> stk; stk.push(root); while(!stk.empty()){ TreeNode* node = stk.top();

2021-08-27 21:23:35 110

原创 C++ static静态变量的作用总结

1.先来介绍它的第一条也是最重要的一条:隐藏。(static函数,static变量均可)当同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性。举例来说明,同时编译两个源文件,一个是a.c,另一个是main.c。//a.cchar a = 'A'; // global variablevoid msg(){ printf("Hello\n");} //main.c int main(){ extern char a; // extern v

2021-03-15 15:36:58 5188 2

转载 从 pthread 转换到 std::thread

以前一直都是用pthread的API写C++的多线程程序。虽然很早之前就听说,从C++11开始,标准库里已经包含了对线程的支持,不过一直没有拿来用,最近刚好有空,借着pthread的经验学习下std::thread的用法。Threadstd::thread的构造函数方便得出人意料,这得感谢std::bind这个神奇的函数。在std::thread的构造函数里,你可以直接传递一个函数和这个函数的参数列表给这个线程。你甚至可以传递一个类成员函数。如果你这么做了,参数列表的第二个参数(第一个参数是被传递的成员

2021-01-21 20:46:43 894

原创 网络编程使用标准I/O的危险以及正确使用RIO包

一、各IO包的关系Unix I/O模型是在操作系统内核中实现的,应用程序可以通过诸如open、close、lseek、read、write和stat这样的函数来访问Unix I/O。较高级别的RIO和标准I/O函数都是基于Unix I/O函数来实现的。RIO函数它们自动处理不足值,并且为读文本行提供了一种高效的带缓冲的方法。标准I/O函数提供了Unix I/O函数的一个更加完整的带缓冲的替代品,包括格式化的I/O例程,如printf和scanf。二、网络编程不应该使用标准I/O通过一个例子可以看到

2021-01-20 11:00:02 893 1

原创 最小生成树算法--kruskal/Prim

一、kruskal算法此算法可以称为“加边法”,初始最小生成树边数为0,每迭代一次就选择一条满足条件的最小代价边,加入到最小生成树的边集合里。把图中的所有边按代价从小到大排序;把图中的n个顶点看成独立的n棵树组成的森林;按权值从小到大选择边,所选的边连接的两个顶点vi,vj,vi,vj属于两颗不同的树(一棵树上的两条个顶点相连的话就形成环了),则成为最小生成树的一条边,并将这两颗树合并作为一颗树;重复(3),直到所有顶点都在一颗树内或者有n-1条边为止。//****kruskal*****

2021-01-20 10:22:32 117

原创 C++ STL中容器的数据成员和迭代器总结

记录STL容器中的数据成员和迭代器结构。(配合大佬源码分析食用)1、list容器先给出大佬的详细源码分析https://blog.csdn.net/qq_41453285/article/details/1035712461.1 list数据成员关于list容器的数据成员和迭代器如上图所示,因此可以得到list本身大小为4字节(__list_node*)list的每个节点是一个结构体。以下是list的节点(node)结构:template <class T>struct _

2020-11-10 21:28:56 349

原创 MySQL基础----理解redolog和binlog的作用

SQL 语句分类:Data Definition Language (DDL数据定义语言) 如:建库,建表(create / alter / drop)Data Manipulation Language(DML数据操纵语言),如:对表中的记录操作增删改(insert /update/delete)Data Query Language(DQL 数据查询语言),如:对表中的查询操作(select /show)Data Control Language(DCL 数据控制语言),如:对用

2020-10-29 17:03:09 1152 1

原创 整型值转换为字符型的高效率函数

背景:在看muduo库的时候,看到一个整型转字符型的函数对指针的运用值得学习和借鉴。const char digits[] = "9876543210123456789";const char* zero = digits + 9;// Efficient Integer to String Conversions, by Matthew Wilson.//将 整型value转为字符,并保存到buf中template<typename T>size_t convert(char bu

2020-09-23 15:57:31 306

原创 阻塞模式和非阻塞模式下send、sendto、recv、recvfrom的表现

首先socket在默认情况下是阻塞状态的(未指异步操作以及其它一些特殊用途下,直接默认为非阻塞),这就使得发送以及接收操作处于阻塞的状态,即调用不会立即返回,而是进入睡眠等待操作完成。下面把讨论点分为发送以及接收。一、发送选用send(这里特指TCP)以及sendto(这里特指UDP)来描述首先需要说明的是,不管阻塞还是非阻塞,在发送时都会将数据从应用缓冲区拷贝到内核缓冲区(SO_RCVBUF选项声明,除非缓冲区大小为0)。1、在阻塞模式下send操作将会等待所有数据均被拷贝到发送缓冲区后才会返回。

2020-09-23 10:46:08 2982 1

转载 【转载】【C++】数组初始化

背景:在刷LeetCode时,使用数组经常发生意料之外的bug,查找原因之后,发现是以为默认初始化的数组,其实并没有初始化,所以下面叫一下数组的定义及初始化。转载自:https://www.cnblogs.com/haoyijing/p/5815035.html定义:int *pia = new int[10]; // array of 10 uninitialized intsint *p = new int[len];//len可以是运行时才确定的int型数字此 new 表达式分配了一个含

2020-09-18 10:19:09 517

原创 链表排序-观“归并排序”有感

先贴上LeetCode原题链接:链表排序注意:原题要求是时间复杂度O(nlogn),空间复杂度O(1)两种解法时间复杂度都是O(nlogn),递归的空间复杂度为O(n),迭代的空间复杂度为O(1)解法一:归并排序(递归)关于递归的通用思路:先找终止条件,如该题中终止条件head == NULL || head->next ==NULL思考返回值,每一级递归向上要返回什么信息单步怎么写,也是最关键的步骤,在该题中也就是如何将两个排好序的链表合并。通过递归实现链表归并排序,有以下两个

2020-09-11 21:59:36 86

原创 muduo网络库学习笔记(4)——FileUtil类以及文件读写操作

先介绍关于获取文件信息的函数:#include <unistd.h>#include <sys/types.h>#include <sys/stat.h>//获取path路径的文件信息int stat(const char *path, struct stat *buf);//获取文件描述符fields的文件信息int fstat(int filedes, struct stat *buf);//类似于stat函数,但当参数1是符号链接时,返回该符号链接的

2020-08-13 15:39:31 507

原创 muduo网络库学习笔记(3)——Singleton类以及单例模式的总结

先介绍一下单例模式:https://www.cnblogs.com/sunchaothu/p/10389842.html上文所讲的几种单例模式从懒汉式(Lazy-Initialization)的方法升级到使用锁机制和智能指针,再升级到使用局部静态变量(关于静态变量的特性:如果当变量在初始化的时候,并发同时进入声明语句,并发线程将会阻塞等待初始化结束),对加深C++特性大有帮助。但在muduo库中采用有pthread_once实现单例模式:#ifndef MUDUO_BASE_SINGLETON_H

2020-08-12 20:59:03 205

转载 C++中引用传递和指针传递的区别

转载:https://www.iteye.com/blog/xinklabi-653643指针传递的实质:指针传递参数本质上是值传递的方式,它所传递的是一个地址值。值传递过程中,被调函数的形式参数作为被调函数的局部变量处理,即在栈中开辟了内存空间以存放由主调函数放进来的实参的值,从而成为了实参的一个副本。值传递的特点是被调函数对形式参数的任何操作都是作为局部变量进行,不会影响主调函数的实参变量的值。(这里是在说实参指针本身的地址值不会变)如果理解不了大可跳过这段引用传递:形参相当于是实参的“别

2020-08-12 16:48:50 147

原创 std::bind函数

bind()接受的第一个参数必须是一个可调用的对象f,可以是函数、函数指针、函数对象和成员函数指针,之后接受的参数的数量必须与f的参数数量相等,这些参数将被传递给f作为入参。绑定完成后,bind会返回一个函数对象,它内部保存了f的拷贝,具有operator(),返回值类型被自动推导为f的返回值类型bind详细使用//普通全局函数void Out( int & elem){ std::cout << elem << " ";}//类template<t

2020-08-10 21:02:36 1701 1

原创 虚拟地址空间的区域划分

本篇接下来所讨论的范围在x86体系32位Linux环境下。虚拟地址空间由虚拟内存来提供的,关于虚拟内存的三个重要能力:它将主存(RAM)看成是一个存储在磁盘(ROM)上的地址空间的高速缓存,在主存中只保存活动区域,并根据需要在磁盘和主存之间来回传送数据,通过这样来高效使用主存它为每一个进程提供了一致的地址空间,从而简化了内存管理保护每个进程的地址空间不被其他进程破坏Linux系统会当前每一个进程分配一个2^32位大小(4G)的一块空间,这块空间就叫做进程的虚拟空间。IBM公司关于虚拟的解释:

2020-08-10 15:43:21 1434

原创 muduo网络库学习笔记(2)—Timestamp类及时间相关的函数

muduo网络库学习笔记(1)—Timestamp类1. 时间戳(Timestamp)类图一个常量kMicroSecondsPerSecond,表示每秒所对应的微秒数,成员变量microSecondsSinceEpoch_表示到1970-01-01 00:00:00 UTC的微秒数2. 关于使用时间的API先看三个时间结构体:struct timeval{ long tv_sec;//秒 64位 8字节 long tv_usec;//微秒};struct tm {  int t

2020-08-10 14:40:21 271

原创 muduo网络库学习笔记(1)——thread类

Thread类图Thread::start()调用的是startThread(…)关于startThread(…)函数,它的形参是ThreadDate类,下面是该类的结构体`struct ThreadData{typedef muduo::Thread::ThreadFunc ThreadFunc;ThreadFunc func_;string name_;pid_t* tid_;CountDownLatch* latch_;ThreadData(ThreadFunc func,co

2020-07-29 21:22:22 207

原创 回收子进程函数--wait、waitpid

wait回收子进程函数原型int status;pid wait(&status);功能阻塞等待子进程回收子进程资源返回子进程结束状态参数status为传出参数,保存子进程结束的信息(结束的原因,例如正常结束、异常中断…)返回值回收成功返回进程pid,失败返回-1关于wait函数的补充有以下几个宏函数int WIFEXITED(int status)若返回值非0,即正常退出WEXITSTATUS(int status)若上函数非0,即子进程正常结束–>获取进

2020-07-03 19:43:29 327

原创 Linux文件操作的C库函数(read,write,lseek)

read_write函数1. read函数函数原型: ssize_t read(int fd, void *buf, size_t count); 参数: fd:文件描述符,open函数的返回值 buf:缓冲区,存储要读取的数据 count:缓冲区能存取的最大字节数 sizeof(buf) 返回值: -1 :失败 >0:读取的字节数 =0:文件读完了 2. write函数函数原型:ssize_t write(int fd, void *buf, size..

2020-07-02 17:04:56 860

原创 Linux中vi编辑器指令大全

三种模式一般指令模式编辑模式指令列模式三种指令的关系及作用一般指令模式“光标移动”常用指令四个方向键控制最基础的移动n,向下移动n行nG,n表示数字,指移动到第n行(在指令列命令模式中有个:set nu命令可以显示行号)G,移动到改文件最后一列gg,移动该文件第一列[Ctrl]+[f],向下移动一页[Ctrl]+[b],向上移动一页[Ctrl]+[d],向下移动半页[Ctrl]+[u],向上移动半页0或[home],数字0,移动到该列最前面$或[End],移动到该列

2020-06-18 19:58:33 139

原创 回溯算法

使用回溯算法解决问题的思路第 1 步都是先画图,画图是非常重要的,只有画图才能帮助我们想清楚递归结构,想清楚如何剪枝。在画图的过程中思考清楚:1、分支如何产生;2、题目需要的解在哪里?是在叶子结点、还是在非叶子结点、还是在从跟结点到叶子结点的路径?3、哪些搜索是会产生不需要的解的?例如:产生重复是什么原因,如果在浅层就知道这个分支不能产生需要的结果,应该提前剪枝,剪枝的条件是什么,代码怎...

2020-03-31 14:33:07 112

原创 反转链表-LeetCode

递归法递归版本稍微复杂一些,其关键在于反向工作。假设列表的其余部分已经被反转,现在我该如何反转它前面的部分?假设列表为:n1→…→nk−1→nk→nk+1→…→nm→∅若从节点 nk+1​ 到 nm​ 已经被反转,而我们正处于 nk​。n1→…→nk−1→nk→nk+1←…←nm我们希望 nk+1 的下一个节点指向 nk​。所以,nk.next.next = nk。要小心的是 n1...

2020-03-24 10:17:40 66

转载 最大子序列、最长递增子序列、最长公共子串、最长公共子序列、字符串编辑距离(转载)

链接

2020-03-23 22:53:35 75

空空如也

空空如也

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

TA关注的人

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