C++
文章平均质量分 91
猪皮兄弟
C生万物,从0到1
展开
-
【项目设计】 负载均衡在线OJ系统
我们选择在线oj系统项目的原因是因为它可以帮助我们提高编程能力和解决问题的能力,同时也可以帮助我们更好地适应工作和学习中的编程需求。在线oj系统具有丰富的题库和实时反馈功能,可以帮助我们更好地进行编程练习和测试。 此外,负载均衡在线oj系统还可以进行项目的扩展,具有方便的使用和活跃的社区互动等优势,可以提高我们的学习效果和团队协作能力。原创 2023-05-16 18:37:37 · 2092 阅读 · 1 评论 -
【C++项目设计】tcmalloc高并发内存池
本项目是实现一个高并发的内存池,是把google的一个开源项目tcmalloc的核心给实现了下来,tcmalloc全称Thread-Caching Malloc,即线程缓存的malloc,实现了高效的多线程内存管理,它是用于替代系统的内存分配相关的函数(如malloc、free)。1. tcmalloc知名度是非常高的,Go语言就直接用它做了自己的内存分配器。2. 该项目是对tcmalloc中最核心的框架的一个简化,模拟实现出mini版的高并发内存池。。。。原创 2023-05-15 09:03:17 · 695 阅读 · 0 评论 -
Linux线程同步
比如去买手机,连续三十天,我每天都去问有货吗,售货员说没有,第三十天我去的时候才有,这虽然没有错,但是不合理,十分的浪费资源和降低效率。而且如果票卖完了,线程需要等待放票,那么只有互斥的话就一直去申请锁,一直做无用功,没错但不合理原创 2023-02-06 17:02:06 · 481 阅读 · 0 评论 -
Linux线程互斥
临界资源:多线程执行流共享的资源就叫做临界资源,在一个资源被多个执行流共享的情况下,我们通过一定的方式,任何时候只允许一个执行流访问的资源称为临界资源临界区:每个线程内部,访问临界资源的代码,就叫做临界区互斥:任何时候,互斥保证只有一个执行流进入临界区,访问临界资源,通常对临界资源起保护作用(对临界资源保护)原子性:不会被任何调度机制打断的操作,该操作只有两态,要么完成,要么不做必须通过代码层面来进行对临界资源的保护,有一种保护手段就叫做互斥,我们可以通过加锁原创 2023-02-05 22:37:35 · 332 阅读 · 0 评论 -
Linux线程控制
对于线程分离,主线程可以不用等这个新线程了,那是不是可以主线程直接走了呢?①主线程退出就意味着进程退出,那么所有执行流都会终止,有可能这个分离的线程还有事要干②无论在多进程还是多线程场景下,都应该主进程或者主线程最后退出,因为它不仅仅要担任创建,还有资源回收的职责③对于服务器来说,主线程或者主进程都是不退出的,所以怎么用还得取决于场景④不要乱用原创 2023-02-05 16:40:15 · 371 阅读 · 0 评论 -
Linux线程理解
在Windows当中,就有真正的线程系统中存在大量进程,就意味着存在大量的线程如果创建特定的数据结构,这个结构中的代码,逻辑等等,其中有相当一部分是非常类似的,所以如果想Windows这样单独设计,那么很多工作是重复的所以Linux决定,没必要在内核层面区分进程和线程,所有进程和线程都通过task_struct来统一表示,只不过进程有独立的地址空间,线程共享地址空间原创 2023-02-04 18:07:07 · 505 阅读 · 0 评论 -
IPC进程间通信-system V 共享内存
先回顾一下动态库,动态库是运行时库,在运行时才进行加载,而在使用动态库的地方保存的是偏移量,动态库加载后,各个使用动态库的程序都会根据加载的起始地址计算出使用到的函数和变量的地址。这些都在地址空间的共享区建立了映射,一个动态库可以被多个程序使用,所以也叫共享库。那操作系统自己申请了一部分空间,将这一部分空间,通过页表,映射到申请的空间,然后页表返回这一部分空间的起始地址,那上层就拿到了这样一个虚拟地址,同样的,可以映射给另一个进程,这样就可以同时访问到这部分空间原创 2023-01-10 16:57:52 · 413 阅读 · 0 评论 -
IPC进程间通信-管道
进程的运行具有独立性,带来的直接结果就是进程间想要通信的话,提高了难度,进程间通信的本值就是让不同的进程==看到==同一份资源(内存空间),并且这一份资源不能属于任何一个进程(就算是写入缓冲区,另一个进程再去读,也是读不到的,因为写时拷贝)所谓的独立性,不是绝对的独立,而是大部分情况下,是独立的,该进程运行终止后,不会去引用其他进程原创 2023-01-10 10:21:38 · 285 阅读 · 1 评论 -
动态规划经典题:编辑距离(hard) 详解,看了还不会你来砍我
一般的,我们在做序列DP问题的时候,遇到两个字符串都会用一个二维数组来进行DP,最长公共子序列简称LCS(longest common subsequence)对于本题状态定义:DP[i][j]表示具有word1[0:i]的字符串和word2[0:j]的字符串中的LCS比如"abcde" [0:2]也就是abc原创 2023-01-01 15:34:21 · 2087 阅读 · 0 评论 -
红黑树的迭代器&&红黑树与AVL树的比较
红黑树和AVL树都是高效的平衡搜索二叉树,增删查改的时间复杂度都是O(logN),因为最坏查找高度次,红黑树不追求绝对平衡,其次只需要保证最长路径不超过最短路径的二倍(通过颜色的互斥来达到这一点),这就决定了红黑树会有更少的旋转,所以在经常进行增删的结构中性能比AVL树更优,而且红黑树实现比较简单,所以红黑树的运用比AVL树更多原创 2022-12-28 17:56:47 · 270 阅读 · 0 评论 -
手撕红黑树、三种情况就可玩转红黑
红黑树只需要掌握三种情况便可玩转1.叔叔为红,变色到头即可2.叔叔存在且为黑,旋转+变色 第一种是旋转的时候不会影响左右子树黑色结点总数,单旋 第二种是旋转时会影响左右子树的黑色结点总数,双旋叔叔存不存在都差不多,直接旋转即可,不影响一直循环到parent不为红或者到根原创 2022-12-25 21:20:00 · 820 阅读 · 0 评论 -
map与set详解
关联式容器:也是用来存储数据的,与序列式容器不同的是,其里面村的是这样结构的键值对,在数据检索时效率更高原创 2022-12-24 17:38:41 · 453 阅读 · 0 评论 -
set,map相关题目,更好地了解set与map
第一种思路:用一个map来进行计数,然后用priority_queue优先级队列来进行大堆排序,其中需要自己写仿函数,并且按照字典序的方式进行排序;原创 2022-12-20 19:26:44 · 80 阅读 · 0 评论 -
手撕AVL树之平衡因子完成四种旋转
如果是有序的或者接近有序,那么查找的效率就退化的很厉害,效率无法保证,那么就要开始尝试控制平衡原创 2022-12-20 15:14:35 · 390 阅读 · 0 评论 -
二叉树的非递归与相关oj
思路:我们可以想象它已经是遍历好的结果,我们只是对它的左右指针进行一点调节,利用递归来进行整棵树进行递归(可以认为是已经构建好了的双向链表,但是指向出了点问题,我们要通过对树的中序遍历这种方式来顺序访问到双向链表中的各个结点来修改指向)原创 2022-12-18 16:32:04 · 415 阅读 · 0 评论 -
搜索二叉树详解
搜索二叉树:搜索二叉树增删查的时间复杂度是O(h) h是树的高度最坏的单支情况下是O(N),所以说搜索二叉树还是有缺陷的,最坏情况下增删查太慢了,想达到O(logN必须是满二叉树或者完全二叉树),所以就有了AVL树,红黑树等等,这些平衡树和搜索树的却别仅仅在效率上,功能上并没有区别原创 2022-12-17 15:35:40 · 380 阅读 · 0 评论 -
Linux文件系统调用接口&&文件描述符的理解
①.系统调用对于我们来说是比较难的,因为我们需要系统要去干什么,需要传哪些参数,所以学习成本太高,所以语言层次,对系统调用接口进行了封装,导致了不同的语言,有不同的语言级别的文件访问接口封装出来的接口是有多个的,但是文件类的系统调用接口,在Linux上,只有一套②跨平台如果语言不提供对文件的系统封装接口,那么所有的访问文件操作,必须使用操作系统提供的系统调用接口,一旦这样,那编写的代码在其他平台就运行不了了,而我如果进行封装,不同的平台进行不同的封装,但是提供给用户的接口都是一样的,这样,就实现了原创 2022-12-03 21:45:19 · 239 阅读 · 0 评论 -
C++异常及异常优缺点
1.终止程序比如assert去断言(assert只在Debug模式生效)缺陷:用户难以接受,比如发生内存错误,除零错误时就会终止程序2.返回错误码缺陷:需要程序员自己去查对应的错误信息,比如系统的很多库接口函数都是把错误码放在error中,表示错误。原创 2022-12-01 21:50:12 · 7029 阅读 · 1 评论 -
C++11(三)可变模板参数、lambda表达式、包装器
push_back(make_pair(...))是一次构造+一次拷贝构造/移动构造(左值/右值)而传参数包的话,我只需要传参数过去构造里面的pair(因为里面有列表初始化,可以生成pair)所以emplace确实在某些地方更高效原创 2022-11-29 15:25:51 · 1246 阅读 · 0 评论 -
C++11(二)右值引用&&移动语义
如果没有实现移动构造函数,且没有自己实现析构函数,拷贝构造,拷贝赋值重载的任意一个(三个都不写才会生成,但是这三个只要有一个写了,基本都要写),那么编译器才会自动生成,并且,默认移动构造对于内置类型对象进行值拷贝,自定义类型对象,则看这个对象是否实现移动构造,如果实现就调用它的移动构造,没有实现就调用拷贝构造。原创 2022-11-28 14:39:44 · 865 阅读 · 0 评论 -
C++11(一)
之前呢{}就是对于结构体和数组进行统一地列表初始值设定C++11扩大了用大括号括起来地列表初始化的使用范围,使其可对所有的内置类型和用户自定义类型,使用列表初始化时,可添加等号,也可以不加原创 2022-11-28 12:33:56 · 726 阅读 · 0 评论 -
面试宝典之C++多态灵魂拷问
析构函数需要定义成虚函数,这是因为避免内存泄漏。如果不定义成虚函数,那么A*a = new B/A&a = b;(b是new出来的),他们就只能析构父类的部分,而子类新开辟的空间就没有被释放掉,导致内存泄漏,编译器为了能让析构函数完成重写,函数名会同一处理成destructor,然后调用的时候,只需调用子类的析构就可以了(父类的析构会在子类的析构之后自动调用。原创 2022-11-27 09:37:39 · 374 阅读 · 0 评论 -
C++中的多态(下)
1.修饰类,表示最终类,不能被继承2.修饰虚函数,表示该虚函数不能被重写这个场景是很少见的,因为虚函数写出来就是为了重写去构成多态原创 2022-11-26 12:37:57 · 455 阅读 · 0 评论 -
C++中的多态(上)
通俗来说,多态就是多种形态,具体点就是在完成某个行为,当不同的对象去完成时会产生不同的状态比如买票,普通人正常买票,学生半价买票,军人优先买票原创 2022-11-26 08:00:00 · 409 阅读 · 0 评论 -
C++中的继承(下)
继承允许根据基类的实现来定义派生类的实现,这种通过生成派生类的复用称为白箱复用(white-box reuse),在继承方式中,基类的内部细节对子类可见,继承一定程度上破坏了基类的封装。基类的改变,对派生类有很大的影响,派生类和基类间的依赖关系很强,耦合度高。原创 2022-11-25 10:53:06 · 424 阅读 · 0 评论 -
C++中的继承(上)
继承(inheritance)机制是面向对象程序设计使代码可以复用==的重要手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认识过程,以前我们接触的复用都是函数复用,继承是类设计层次的复用继承说白了就是类的复用原创 2022-11-24 21:13:36 · 350 阅读 · 0 评论 -
模板进阶&&模板分离编译的问题与解决
模板参数分为类型形参与非类型形参类型形参:出现在模板参数中,跟在class或者typename之后的参数类型名称非类型形参:就是一个常量作为类模板/函数模板的一个参数,在类模板/函数模板中可将该参数当成常量来使用原创 2022-11-23 23:04:07 · 372 阅读 · 0 评论 -
list详解&&list模拟
算法库中的sort是使用的是QuickSort,针对的是连续空间,所以list需要自己写一个独立的出来,链表的sort底层就是 MergeSort。但是,链表的sort价值不大,不如使用vector+算法库的sort。原创 2022-10-12 20:24:37 · 453 阅读 · 0 评论 -
stack,queue,deque,priority_queue与仿函数
适配器是一种设计模式(设计模式是一套被反复使用的,被多数人知晓的、经过分类编目的,代码设计经验的总结),该种模式是将一个类的接口转换成客户端希望的另一个接口。原创 2022-10-13 11:00:00 · 490 阅读 · 1 评论 -
vector详解以及一些问题(C++)
在 c++ 中,vector 是一个十分有用的容器。 它能够像容器一样存放各种类型的对象,简单地说,vector是一个能够存放任意类型的动态数组,能够增加和压缩数据。vector 是同一种类型的对象的集合,每个对象都有一个对应的整数索引值。 和 string 对象一样,标准库将负责管理与存储元素相关的内存。 我们把 vector 称为容器,是因为它可以包含其他对象。原创 2022-09-06 16:30:06 · 1238 阅读 · 15 评论 -
【C++】string类的模拟实现.深浅拷贝与引用计数,写时拷贝的优化
有人觉得深拷贝代价太大,就提出了 引用计数+写时拷贝 的方法1.增加一个引用计数,多少个引用指向浅拷贝的哪个空间,就计数多少,计数器减到1的时候才去析构,不然不析构2.写时拷贝,去写的时候才去深拷贝(延迟拷贝动作)原创 2022-09-05 18:46:48 · 837 阅读 · 7 评论 -
【C++】string类的使用,小试牛刀
学到的知识需要应用起来才能知道自己掌握,多做题对于现在的我们而言是很有帮助的,感谢大家的支持,大家一起共同进步!原创 2022-09-04 16:00:00 · 366 阅读 · 7 评论 -
【C++】string类(详解),常见的函数都在这里,你都了解吗?
C语言中,字符串是以\0结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列的库函数,但是这些库函数始于字符串是分离开的,不太符合OOP面向对象的思想,而且底层空间需要用户自己管理,稍不留神还会越界访问,所以出现了string类原创 2022-09-04 10:00:00 · 497 阅读 · 8 评论 -
【C++】模板初阶,了解函数模板和类模板的使用&&一些可能出现的问题
模板是一个非常强大的C++功能,STL的各种组件也是基于模板的。所以,有必要了解一下C++的模板。 模板定义并不是真正定义了一个函数或者类,而是编译器通过程序员写出的模板和形参自动生成对应版本的定义,这个过程就叫做模板的推演和实例化,编译器生成的版本通常被称作模板的实例,编译器生成的具体过程,类似于宏替换由于编译器不回去调用模板本身,所以一般模板是放在头文件中的原创 2022-09-03 10:00:00 · 399 阅读 · 11 评论 -
【C++】C++内存管理方式,malloc/free和new/delete的这些问题你都知道吗?&& 内存管理的常见面试题
malloc/free和new/delete的区别是什么?1.malloc/free是函数,new/delete是操作符2.malloc申请的空间不会初始化,就只是申请空间,而new会去调用构造函数,所以会初始化...为什么不直接malloc而需要封装成operator new......原创 2022-09-02 10:00:00 · 478 阅读 · 12 评论 -
【C++】类和对象(四)“这三种”成员变量只能放在初始化列表中初始化,你都知道吗?
在调用构造函数的时候所有的成员变量都要先走一遍初始化列表进行定义,同时可以在初始化列表进行初始化。首先,只有在实例化时调用构造函数走进初始化列表才算是定义成员变量,不然都是声明而已,其次,像无默认构造函数的Time,不在初始化列表中去写的话因为没有给参数,所以会报错(就是因为在初始化列表中定义和初始化的,函数体内最多算是在重新赋值)...原创 2022-09-01 10:30:00 · 957 阅读 · 18 评论 -
【C++】类和对象(三)运算符重载 (其中有默认成员函数中的 赋值运算符重载、等等)
对于大结构体来说,传引用是很提高效率的,并且里面不需要改变,最好加上const,保证安全(保证里面不会写错),另外,因为this指针我们不能显示写,所以C++中为了修饰this指针指向的内容不能改变,就只能加在后面,如下所示......原创 2022-08-31 17:37:35 · 1225 阅读 · 35 评论 -
【C++】类和对象(二)构造函数&&析构函数&&拷贝构造函数
像拷贝构造函数,它把内置类型和自定义类型都处理了,那么还有我们自己写的必要吗?这里就涉及到了深浅拷贝的问题浅拷贝(值拷贝)拷贝出来的是同一块空间,当对象生命周期结束时,会调用析构函数去free,同一块空间不能free两次,所以,析构函数会崩溃浅拷贝两大问题:1.一个对象修改会影响另一个对象2.会析构两次,程序崩溃解决办法:自己实现深拷贝,后面再说.........原创 2022-08-30 11:15:14 · 1603 阅读 · 36 评论 -
【C++】类和对象(一),三种类对象模型,全局变量和静态变量在.h中的问题,类的内存对齐等等..快来看看
全局变量的链接属性是所有文件可见,如果在.h文件中定义,会在.cpp中展开,因为是所有文件可见,所以展开的是同一个(地址相同),在链接的时候,多个.obj文件通过连接器链接,这时候会发生符号表的重定位,因为有多个相同的全局变量,所以会发生符号重定义问题..................原创 2022-08-29 10:49:01 · 912 阅读 · 18 评论 -
【牛客网刷题】(第五弹) 多种思路刷题.
牛客网是个很不错的刷题软件,也希望大家能天天在上面刷刷题,大厂offer指日可待啊兄弟们。刷起来原创 2022-08-28 13:23:44 · 1783 阅读 · 10 评论