
C++
文章平均质量分 88
两片空白
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
C++简单实现消息队列
消息队列是一种应用间的通讯方式,消息发送后可以立即放回,由消息系统来确保消息的可靠传递。消息发布者只需要将消息发布到消息队列中,而不需要管谁来取。消息使用者只管从消息队列中取消息而不管谁发布的。这样发布者和使用者都不同知道对方的存在。消息队列普遍使用在生产者和消费者模型中。下面使用C++实现一个简单的消息队列。原创 2024-07-28 20:27:23 · 1254 阅读 · 0 评论 -
deque容器详解,包含源码
vector是一个单向开口的连续线性空间,deque则是一个双向开口的连续线性空间。所谓双向开口,意思是可以在头尾两端分别做元素的插入和删除操作。vector当然也可以进行头尾两端的插入和删除操作,但是头部的插入和删除操作效率极差。需要移动元素。deque允许常数时间内对其头端进行元素的插入和删除操作。deque没有所谓容量的概念。因为它是动态的以分段连续空间组合而成,随时可以增加一段新的空间并连接起来。不会像vector那样,因为空间不足而扩容,复制元素到新的空间,再释放旧的空间。原创 2022-10-09 21:44:02 · 2431 阅读 · 0 评论 -
数据库连接池
Mysql数据库是一个C/S模型,通过客户端来访问服务端。底层使用的是TCP协议。当在我们在程序中需要频繁的访问数据库,也就是需要频繁的连接数据库和断开数据库时,会需要频繁的进行上面的操作。在高并发的情况下会消耗很多时间和资源。使用连接池可以减少这部分的消耗。指挥在创建连接池时,建立连接,在销毁连接池对象时,断开连接。需要连接数据库时,在连接池中取出连接,不需要使用数据库时,将连接放会连接池即可。原创 2022-09-16 09:27:15 · 1342 阅读 · 0 评论 -
简单实现定长内存池
目录前言一.定长内存池 1.1 概念 1.2 实现 1.2.1 成员变量介绍 1.2.2 成员函数介绍 1.2.3细节 1.3 代码前言 我们知道用户申请内存必须通过操作系统,操作系统再从堆上开辟一段空间给用户。但是如果频繁的向操作系统申请空间,导致操作系统需要频繁的为用户开辟空间。但是操作系统需要管理很多东西,这样会导致操作系统的效率变得很低。 ...原创 2021-11-10 17:32:27 · 1549 阅读 · 0 评论 -
STL——空间配置器
目录前言一.概念二.优点三.空间配置器原理3.1 一级空间配置器 3.2 二级空间配置器 3.2.1 内存池技术 3.2.2 哈希桶技术四.内存碎片问题 4.1 外碎片 4.2 内碎片五.具体细节5.1 申请空间 5.2 填充内存块 5.3 向内存池中索要空间前言 我们知道STL容器在不断保存...原创 2021-11-08 17:06:23 · 3021 阅读 · 1 评论 -
C++的类型转换的细分
目录一.C语言中的类型转换二.C++的类型转换 2.1 为什么C++需要规定类型转换 2.2 static_cast介绍 2.3 reinterpret_cast介绍 2.4 const_cast介绍 2.5 dynamic_cast介绍三.explicit关键字一.C语言中的类型转换 在C语言中,如果赋值运算符左右两侧类型不同,或者形参与实参类型不匹配,或者返回值类型与接收返...原创 2021-10-31 17:33:19 · 413 阅读 · 1 评论 -
特殊类设计,单例模式
目录一.请设计一个类,只能在堆上创建对象二.设计一个类,只能在栈上创建对象三.设计一个类,不能被拷贝四.设计一个类不能被继承五.设计一个类,只能实例化一个对象 5.1 单例模式由两种实现模式5.2 懒汉模式和饿汉模式对比一.请设计一个类,只能在堆上创建对象 思路:只能在堆上创建对象说明,我们不能在我们不能在外面随意创建对象,所以需要类提供一个对外接口,创建在堆上创建一个对象。这里有两个注意的点:不能在外面随意创建对象。 类...原创 2021-10-31 11:44:01 · 335 阅读 · 0 评论 -
C++11——智能指针
前言 由于C++没有GC(垃圾回收器),程序员从堆上申请的资源,打开的文件,创建的套接字需要我们手动释放和关闭。 但是可能会出现两个问题:异常安全问题。申请完资源,由于异常需要捕捉,使得执行流不会按顺序进行,导致资源还没有释放和关闭,就跳到别的地方执行了。 由于需要程序员手动释放和关闭,可能会有忘记释放和关闭的问题。 这样就会导致资源的泄漏。计算机的资源是有限的,导致我们可以使用的资源越来越少。 智能指针是针对我们从堆上申请的空间,...原创 2021-10-30 13:01:52 · 3029 阅读 · 0 评论 -
C++异常详细介绍
目录前言一.C++异常概念二.异常的抛出和匹配规则三.异常的重新抛出四.异常安全问题五.异常规范说明六.自定义异常体系七.C++标准库的异常体系八.异常优缺点前言 在C语言中处理错误的方式和缺陷有:返回错误码。缺陷:1.错误码不好设置,比如:除0操作,就不好返回错误码。如果返回一个数字,可能会有两层含义,是错误,还是结果呢。一般我们会在参数加一个输出型参数返回结果,再规定成功和失败返回的数字。 ...原创 2021-10-29 13:39:09 · 10057 阅读 · 6 评论 -
C++11——线程库,互斥量,原子性库,条件变量
目录前言一.线程库 1.线程库接口2.使用 2.1 线程函数 2.2 线程函数的参数 2.3 join和detach介绍二.互斥量介绍 1. 互斥量种类 1.mutex最基本Mutex类 2.recursive_mutex递归Mutex类 3. timed_mutex 定时Mutex类 4.recursive_tim...原创 2021-10-28 15:04:49 · 640 阅读 · 0 评论 -
C++11——lambda表达式
目录前言一.lambda表达式用法二.lambda表达式语法三.lambda表达式的原理前言 在显示生活中,我们在用手机购物时。总是可以在页面上看到下面这样的选项。 我们知道底层这是通过排序来完成的,但是当我们实现时,要写多个排序算法,写多个仿函数来实现不同变量的比较。比如下面代码:struct CompareNameSmall;struct CompareNameBig;struct ComparePriceSmall;stru...原创 2021-10-27 22:06:12 · 8413 阅读 · 0 评论 -
C++11——初始化列表,变量类型推到,默认成员函数控制
一.初始化列表 1.1 C++98的初始化 在C++98中,数组可以用"{}"整体初始化。比如:int arr[] = {1,2,3,4,5,6};但是对于自定义类型却不能用"{}"进行初始化。比如:vector<int> v = {1,2,3,4,5,6};//编译错误使得我们必须先将自定义类型定义出来,再将每一个成员变量插入进去。导致很不方便 1.2 C++11的初始化 针对上面这种情况,C...原创 2021-10-27 09:38:29 · 957 阅读 · 0 评论 -
C++11——右值引用
前言 在C++98中也有一个引用,为左值引用,但是左值引用有一些不足。而C++11的右值引用的提出弥补了左值引用的不足。 左值引用和右值引用都是别名。 说明:下面说引用都代表C++98的左值引用。一.右值引用的概念 右值引用也是一块空间的别名。只能对右值进行引用。使用是在类型后面加两个&&。#include<iostream>using namespace std;int Add(int x,...原创 2021-10-26 10:08:27 · 9278 阅读 · 8 评论 -
分布式存储和哈希一致性
前言 一般情况下,现在电脑内存4~8G,硬盘500~1024G。很多应用的数据并不是保存在我们的电脑里,我们的电脑保存不下,而是保存在开发该软件公司的服务器中。分布式存储 但是我们现在日常生活中用户这么多,肯定会产生大量的数据。比如:现在微信有10亿用户,一个用户的微信信息100M,假设每一个通过微信号来对应微信信息。这是时候就需要差不多10WT的空间来保存这些数据。假设一台服务器由1T的空间,现在就需要10W台服务器。 那么现在就需要考虑,服务器如...原创 2021-09-12 15:43:48 · 228 阅读 · 0 评论 -
哈量数据处理面试题(哈希切割,位图,布隆过滤器)
目录前言一.位图应用二.布隆过滤器三.哈希切割前言 海量数据处理,顾名思义。就是数据两很大,内存不足以保存这么多数据的问题该如何解决。 一般可以使用位图(整形),布隆过滤器(非整形),哈希切割的方法。一.位图应用给定100亿个整数,设计算法找到知出现一次的整数? 首先估算,100亿整数保存需要多少空间?1个整数4字节,100亿整数400亿字节。1G10亿字节,所以这里差不多要10G。内存无法将数据全部保存,只能将数据保存在硬...原创 2021-09-12 14:43:47 · 370 阅读 · 0 评论 -
哈希表应用(位图和布隆过滤器)
目录一.位图 1.1 位图概念 1.2 位图的应用 1.3 位图的实现 二.布隆过滤器 2.1 布隆过滤器的概念 2.2 布隆过滤器的优缺点 2.3 实现一.位图 1.1 位图概念 位图,是用比特位来表示某种状态。一个位有两种状态0和1,0可以表示一种状态,1可以表示一种状态。通常是用来判断某个数据存不存在。比如:判断一个数...原创 2021-09-11 14:21:51 · 404 阅读 · 0 评论 -
简单了解unordered_set和unordered_map底层
前言:unordered_set和unordered_map底层都是由哈希表实现的,想了解哈希表的小伙伴可以看下一这篇博客哈希表(散列表)介绍。由于解决哈希冲突的方式开散列比闭散列更优。所以使用开散列的来实现哈希表。一.哈希表(开散列)实现 1.1 介绍模板参数//K:关键码//T:保存数据,unordered_map是一个键值对,unordered_set是K//KOFT:由于unordered_map和unordered_set保存值不同,KOFT是一...原创 2021-09-10 14:03:05 · 1163 阅读 · 0 评论 -
哈希表(散列表)介绍
目录前言一.哈希概念 1.1 什么时哈希表 1.2 哈希函数1.3 哈希冲突 1.4 哈希冲突的解决1.4.1 闭散列 1.4.2 开散列 1.4.3 问题 前言 哈希表时C++11两容器unordered_set和unordered_map的底层结构。它的搜索的时间复杂度为O(1),常数次。...原创 2021-09-09 22:27:46 · 3385 阅读 · 1 评论 -
了解map和set的底层实现
目录前言一.map和set如何共用一颗红黑树二.迭代器的实现三.map的operator[]操作符重载四.总代码4.1 map代码4.2 set代码4.3 红黑树代码前言 本文主要写的是map和set的简单实现,通过实现来揭开map和set的面纱。是其对于我们来讲不再神秘。 本文实现map和set,最主要的模块有,如何使得map和set共用一颗红黑树。实现map和set的迭代器(主要是迭代器++和--)的基本功能。一.map和...原创 2021-09-07 17:02:42 · 1948 阅读 · 1 评论 -
红黑树介绍和结点的插入
一.红黑树的介绍 1.1 红黑树的概念 红黑树,也是一颗二叉搜索树。但是在二叉搜索树的基础上,在每个结点上增加一个存储位来表示结点的颜色,可以是Red或者Black。通过对任何一条从根节点到一种结点的路径上的...原创 2021-09-06 23:40:29 · 387 阅读 · 1 评论 -
平衡二叉树的删除
目录前言一.结点定义二.删除2.1 按照二叉搜索树来删除结点2.2 更新平衡因子2.3 检测更新完的平衡因子三.完整代码前言 之前再C语言阶段学习了平衡二叉树,用C语言递归实现了一下平衡二叉树的删除与插入。实现如下:数据结构——平衡二叉树(AVL树)之插入和数据结构——平衡二叉树之删除当时学习的时候感觉比较费劲,并且难以理解。 现在在C++阶段又重新学习了一下平衡二叉树,使用非递归实现,再加上结点引入平衡因子和父节点,感觉更好理解了。...原创 2021-09-05 14:16:02 · 1401 阅读 · 2 评论 -
进一步理解平衡二叉树(插入)
前言 前面我们了解了二叉搜索树,也进行了对二叉搜索树的简单实现。但是二叉搜索树存在一个缺陷。当要在搜索树里插入或者删除数据时,都需要进行查找。查找体现了搜索树的效率。当插入二叉树搜索树的集合是一个有序序列时,二叉搜索树会形成一个单支树。变成一个链状结构,这样查找的效率大大降低,最坏情况下,查找的效率为O(N)。并没有很好的体现出搜索树的性质。 而平衡二叉树就很好的体现出了搜索树的性质,查找的效率是树的高度次,最坏的情况下查找的效率是O(logN)。...原创 2021-09-04 11:56:30 · 4494 阅读 · 0 评论 -
树形结构关联式容器(map和set,multiset和multimap)
目录一.容器介绍二.键值对三.树形结构关联式容器3.1 set3.1.1 set介绍3.1.2 set的使用3.2 map3.2.1 map介绍3.2.2 map使用3.2.2 map中operator[]原理3.2.3 用map记录次数3.3multiset3.3.1 multiset介绍3.3.2 multiset使用3.4 multiamp3.4.1 multimap介绍3.4.2使用一.容器介绍STL容器主要分为序列式容..原创 2021-09-02 16:34:43 · 1090 阅读 · 0 评论 -
补充二叉搜索树C++版实现(建议看这)和应用
目录一.实现二叉搜索树二. 二叉搜索树的应用2.1 排序2.2 搜索2.2.1 K模型2.2.2 KV模型(常用)三.二叉搜索树的性能分析一.实现二叉搜索树这里再简单介绍一下二叉搜索树: 首先二叉搜索树是一个二叉树,具有的性质为,左子树的结点值比父节点值小,右子树结点值比父节点值大,并且左右子树同样符合这种性质。 实现的二叉树的功能有:增加一个结点,查找一个结点,删除一个结点,和中序遍历。 为什么没有修改一个结点,...原创 2021-08-31 13:51:14 · 348 阅读 · 0 评论 -
C++中的多态
前言 我认为多态是因为有了虚函数,通过继承,派生类可以重写虚函数,才有了C++的多态。所以要了解多态的原理,需要重点了解虚函数和虚基表。一.多态的概念原创 2021-08-29 21:36:03 · 15202 阅读 · 12 评论 -
C++中的继承
一.继承的概念及定义发现问题:当我们编写一个类时,发现这个类与类外一个类的成员变量和成员方法相似,并且具有一定的包含关系时,我们编写的这两个类会有很多相似的地方。比如:1.1 继承的概念 继承机制是面向对象程序设计使代码可以复用的重要手段。它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生的类称为派生类。 继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承使类设计层次的复用。 ...原创 2021-08-27 18:33:50 · 6298 阅读 · 6 评论 -
模板的进阶
目录一.非类型模板参数二.模板的特化2.1 函数模板的特化2.2 类模板特化2.2.1 全特化2.2.2 偏特化三.模板分离编译3.1 什么是分离编译3.2模板分离编译四.模板总结一.非类型模板参数模板的参数分为类型模板参数和非类型模板参数类型模板参数:出现在模板参数列表中,跟在class或者typename之类的参数类型名称。 非类型形参:就是用一个常量作为类或者函数模板的一个参数,在类或函数模板中可将该参数当作常量来使用。注意...原创 2021-08-11 14:03:20 · 339 阅读 · 0 评论 -
容器适配器stack,queue和priority_queue
一.什么是容器适配器 容器适配器是一个封装了序列容器的一个类模板,它在一般的序列容器的基础上提供了一些不同的功能。之所以称为容器适配器,是因为它是适配容器来提供其它不一样的功能。通过对应的容器和成员函数来实现我们需要的功能。 下面介绍了三个容器适配器:statk<T>,queue<T>,priority_queue<T>。 注意:容器适配器都不存在迭代器。二.stack栈2.1 stack的介绍stac...原创 2021-07-23 20:07:11 · 2134 阅读 · 3 评论 -
string类和vector<char>的区别,vector和list比较
一.string类和vector<char>的区别string类是一个保存字符的动态数组,由于其中有一个接口c_str,转化成c语言的字符串,要以\0结尾,所以string类最后会有一个\0.vector<T>是一个保存T类型的动态数组,vector<char>也是保存字符的动态数组,但是,不会以\0结尾,不保存\0.二.vector和list比较...原创 2021-07-23 11:21:45 · 3960 阅读 · 1 评论 -
list模拟实现
目录准备工作:1.结点类2.迭代器类3.list类3.1 begin()和end()3.2拷贝构造和赋值操作符重载4. 完整代码 为了更好的学会使用list和了解list的底层结构,我对list的一些常用接口进行了一个模拟实现。准备工作: 编写的list由三个类组成,结点类(_list_node),迭代器类(_iterator)和list类(_list)为什么需要这三个类? ...原创 2021-07-22 16:22:45 · 337 阅读 · 0 评论 -
list介绍和list的迭代器失效
一.list使用 1.1 list介绍 list底层是一个双向链表结构,每一个结点由三个成员变量组成。一个成员变量保存元素值,一个成员变量为一个指针保存上一个结点的地址,一个成员变量也是指针保存下一个结点的地址。 1.2 特点list可以在常数时间范围内在任意位置进行插入和删除的序列式容器,因为不需要挪动数据。并且该容器可以前后双向迭代。与其它容器(array,vector,deque)相比,在任意位置插入删除效率更好。 list与forward_...原创 2021-07-22 14:26:16 · 1740 阅读 · 0 评论 -
vector迭代器失效
vector迭代器主要作用是让算法能不用关心底层数据结构。器底层实际是一个指针或者是对指针进行封装,vector迭代器就是一个指针T*。 迭代器失效就是迭代器底层对应指针所指向的空间倍销毁了,导致使用了一块已经被释放了的空间。造成的后果就是程序奔溃。一般都是扩容发生深拷贝时,开辟新空间,旧空间被释放了,但是迭代器没有进行更新,还指向原来的旧空间。会导致底层空间改变的操作,都可能导致迭代器失效。简单来说,会导致扩容发生深拷贝。如resize,reserve,insert,...原创 2021-07-19 16:29:51 · 665 阅读 · 0 评论 -
STL——vector模拟实现
vector介绍: vector原理:vector是表示可变大小数组的序列容器。就像数组一样,vector也采用的连续空间来存储元素。这也意味着vector也可以采用下标对元素进行访问,和数组一样高效。但是,它又不像数组一样,它的空间是可以动态改变的,并且它的大小可以自动进行处理。 本质上来讲,vector使用动态分配的数组来存储它的元素。当新元素插入时,这个数组就需要被重新分配空间大小,为了增加存储空间。做法是:重新开辟一新的数组,然后将元素移到新的数组。 ...原创 2021-07-19 15:53:42 · 307 阅读 · 0 评论 -
写时拷贝(copy on write)
适用于深拷贝提高效率的一种方法。 例如string类,在拷贝构造时,会要用到深拷贝。如果用浅拷贝,会导致两对象的指针指向同一块空间,导致对象析构时,导致同一块空间释放两次,程序奔溃。深拷贝是在对象再开一块空间,将值拷贝过去,再让新对象的指针指向新开辟的空间。 深拷贝运用写时拷贝时,不会立马申请空间。它是一开始先让新的对象的指针先同时指向同一块空间。在读的时候或者是写的时候再在堆上申请空间给对象。 这里引入了一个引用计数:用来记录资源使用者...原创 2021-07-17 14:16:25 · 1362 阅读 · 0 评论 -
深入了解string类接口(实现string类)
前言在博客C++ string类常用接口一文中我们熟知了C++string类的一些常用接口的使用,在本文时来简单实现一下这些常用的接口,带你了解string类的底层原理,然你能轻而易举的掌握string类的使用。说明注意点:在我们自己实现string类时,如果你的类名用的与标准库类名相同时,需要一个命名空间将其与标准库里的string类分开。下面是代码的分开实现,完整代码在最下面给出。一.构造,析构函数和赋值操作符的重载//要在堆上开辟空间将字符串拷贝过去,不能直接在初始化列表里初始化原创 2021-07-16 15:31:01 · 558 阅读 · 0 评论 -
C++ string类常用接口
目录前言一.string类的常用接口1.1 string类对象的构造函数1.2 string对象的容量函数1.3 string类对象的访问及遍历操作1.4 string类修改操作1.5 string 非成员函数前言 在C语言中,字符串是以'\0'结尾的一些字符的集合。为了操作方便,C语言中还提供了一些控制字符串的函数例如strcpy,strcmp,strcat等等。但是这些函数与字符串是分离开的,并不符合C++封装的特性。于是C++中由单独产生了一个s...原创 2021-07-14 16:17:45 · 736 阅读 · 1 评论 -
C++模板
目录前言一.定义二.函数模板2.1 概念2.2 函数模板格式2.3 函数调用的原理2.4函数模板的实例化2.5 函数模板的匹配规则三.类模板3.1 类模板格式3.2 类模板的实例化3.3 类的函数模板前言 我们知道C++相对于C语言新增了一个功能函数重载,简单来说函数重载是对于类型不同的参数,可以存在相同的函数名,编译器会通过实参类型来调用相应的函数。但是,这样会有几个不大实用的地方。重载函数只是参数类型不同,代码的复用...原创 2021-07-13 17:08:59 · 523 阅读 · 5 评论 -
C/C++内存管理
目录一.C/C++内存分布二.C语言中动态内存管理方式三.C++内存管理方式3.1 new/delete操作内置类型3.2 new和delete操作自定义类型四.operator new和operator delete函数五.new和delete的实现原理六.malloc/free和new/delete区别七.内存泄漏7.1定义和危害7.2如何避免一.C/C++内存分布 补充说明:栈又叫堆栈,主要保存非静态局部变量/函数参数/...原创 2021-07-12 16:42:16 · 705 阅读 · 10 评论 -
类和对象(三)——补充(运算符重载,static和explicit关键字和友元,内部类和匿名对象)
一.运算符重载 C++为了增强代码的可读性引入了运算符重载,运算符重载是具有特殊函数名的函数,也具有器返回值类型,函数名和参数列表。 一般运算符只能在内置类型的变量之间使用,运算符重载就是让自定义类型可以像内置类型一样使用运算符。 函数名:由关键字opertor+需要重载的运算符符号。 函数原型:返回值+operator操作符(参数列表)注意:不能通过其它符号来创建新的操作符:比如operator@,@在语言中没有实际意义。 ...原创 2021-07-11 14:49:20 · 484 阅读 · 1 评论 -
类和对象(二)——6个默认成员函数
前言 如果一个类中什么成员都没有,简称空类。空类中什么都没有吗?并不是的,任何一个类在我们不写的情况下,都会自动生成下面6个默认成员函数。一.构造函数1.1定义 构造函数是一个特殊的成员函数,名字与类名相同,创建类类型对象时由编译器自动调用,保证每个数据成员都有一个合适的初始值,并且在对象的生命周期内只调用一次。注意:虽然构造函数名为构造,但是它并不是开辟空间创建对象,而是给对象成员变量赋初值。1.2特性函数名与类名相同 无返回值 对象实例化...原创 2021-07-10 16:22:56 · 275 阅读 · 1 评论