C++
文章平均质量分 80
小菜鸡加油
菜鸡
什么都能折磨
展开
-
分布式存储与一致性哈希
文章目录背景分布式存储一致性哈希背景许多应用的数据比如聊天内容其实也保存在服务端,而当用户基数庞大的时候,一台服务器肯定是存不下数据的。分布式存储例子:假设微信有10亿用户,一个用户的微信信息100M,假设每一个通过微信号来对应微信信息。这是时候就需要差不多10WT的空间来保存这些数据。假设一台服务器有1T的空间,现在就需要10W台服务器。那么如何保存这些数据?我们保存数据肯定是为了更加方便的查找,在面对海量数据的时候,可以采用哈希切割。将每一台服务器进行编号,利用哈希切割,对微信号进行哈原创 2022-03-29 11:20:45 · 308 阅读 · 2 评论 -
多继承时的指针偏移和判等问题
代码#include<iostream>using namespace std;class A { public: int _b1;};class B { public: int _b2;};class C: public A, public B { public: int _b3;};int main() { C c; A* p1 = &c; B* p2 = &c; C* p3 = &a原创 2022-03-18 15:12:40 · 1481 阅读 · 1 评论 -
C++设计模式 | Observer观察者模式
设计模式——观察者模式概念Observer模式也称为发布-订阅(publish-subscribe),定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。当一个对象发生了变化,关注它的对象就会得到通知;这种交互也称为发布-订阅(publish-subscribe)。目标是通知的发布者,它发出通知时并不需要知道谁是它的观察者。常用于解耦事件的观察和事件最终的处理方式。解决的问题Observer模式要解决的问题为:建立一个一(Subject)对多( O原创 2022-03-16 21:55:03 · 1085 阅读 · 0 评论 -
C/C++关键字:static
static关键字文章目录static关键字C语言隐藏场景演示解决方法声明和定义分离使用static关键字及缺陷保持变量内容的持久默认初始化为0Cppstatic类成员变量static类成员方法单例模式C语言隐藏场景演示当我们同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性。会导致符号表认为存在同名全局变量和函数发生碰撞。场景:全局的变量/函数在.h中会在多个.cc文件中拥有且全局可见有链接问题。a.h#pragma once#include<stdio原创 2022-02-21 20:05:09 · 1049 阅读 · 0 评论 -
C++智能指针
智能指针文章目录智能指针1.为什么需要智能指针(智能指针场景)2.内存泄漏2.1什么是内存泄漏2.2内存泄漏的危害2.3内存泄漏分类(了解)2.4如何解决内存泄漏相关问题3.智能指针的使用及原理3.1RAII3.2智能指针的原理3.3auto_ptr3.4unique_ptr3.5shared_ptr3.6weak_ptr4.智能指针的历史5.定制删除器(了解)6.RAII的扩展学习:lock_guard1.为什么需要智能指针(智能指针场景)C++没有垃圾回收机制,new/delete等等出来的资源,原创 2022-02-18 18:32:04 · 603 阅读 · 1 评论 -
C++类型转换
C++的类型转换文章目录C++的类型转换1.C语言中的类型转换2.为什么C++需要四种类型转换3.C++强制类型转换3.1static_cast3.2reinterpret_cast3.3const_cast3.4dynamic_cast3.5explicit4.RTTI(了解)5.常见面试题1.C语言中的类型转换在C语言中,如果赋值运算符左右两侧类型不同,或者形参与实参类型不匹配,或者返回值类型与接收返回值类型不一致时,就需要发生类型转化。C语言中总共有两种形式的类型转换:隐式类型转换和显式类型转原创 2022-02-17 22:30:01 · 531 阅读 · 0 评论 -
C++异常
文章目录1.C语言传统的处理错误的方式2.C++异常概念3.异常的使用3.1异常的抛出和捕获3.2异常的重新抛出3.3异常安全3.4异常规范4.自定义异常体系5.C++标准库的异常体系6.异常的优缺点1.C语言传统的处理错误的方式什么是异常?异常是面向对象语法处理错误的一种方式那么C语言传统的处理错误的方式有哪些呢?终止程序,如assert,exit,缺陷:用户难以接受。如发生内存错误,除0错误时就会终止程序。返回错误码,缺陷:需要程序员自己去查找对应的错误。如系统的很多库的接口函数都是通过把错原创 2022-02-16 21:12:18 · 426 阅读 · 3 评论 -
网络编程套接字
网络编程套接字文章目录网络编程套接字预备知识理解源IP地址和目的IP地址认识端口号理解“端口号”和"进程ID"理解源端口号和目的端口号认识TCP协议认识UDP协议网络字节序网络字节序的规则htonl和ntohl的大小端转换socket编程接口socket常见API理解socketbindinet_addr和inet_ntoa(点分十进制的转换)recvfrom(udp)sendto(udp)INADDR_ANYlisten(tcp)accpet(tcp)recv(tcp)send(tcp)connect(原创 2022-02-07 14:07:09 · 1626 阅读 · 0 评论 -
demo:线程池+tcp
pthreadPool.hpp#pragma once#include<pthread.h>#include<queue>#include<iostream>#include<string>#include<cstring>#include<unistd.h>#include<sys/wait.h>#include<sys/socket.h>#include<arpa/inet.h>原创 2022-02-06 23:55:48 · 546 阅读 · 1 评论 -
C++11
文章目录1.c++11简介2.统一的列表初始化2.1{}初始化2.2std::initializer_list2.2.1std::initializer_list的使用2.2.2底层原理3.声明3.1auto3.2decltype3.3nullptr4.范围for循环5.智能指针6.STL的一些变化**7.右值引用和移动语义**7.1左值引用和右值引用7.1.1左值的概念和左值引用的概念7.1.2右值的概念和右值引用的概念7.1.2右值引用的注意点(完美转发场景的解释)7.2左值引用和右值引用的区别7.2.原创 2022-02-02 23:59:29 · 240 阅读 · 1 评论 -
map和set的实现(2)——红黑树
文章目录1.红黑树的概念2.红黑树的性质与原理3.红黑树节点的定义4.红黑树的插入4.1情况一4.2情况二4.3情况三4.4代码实现4.5小结5.红黑树的检查6.红黑树的删除1.红黑树的概念红黑树,是一种二叉搜索树,但在每个结点上增加一个存储位表示结点的颜色,可以是Red或Black。 通过对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路径会比其他路径长出2倍,因而是接近平衡的。实际当中进行搜索一般使用红黑树,和AVL树相比较并不是质的变化。那么AVL树和红黑树有什么区别呢?原创 2022-01-31 00:20:30 · 4182 阅读 · 4 评论 -
C++特殊类的设计
文章目录设计一个类,只能在堆上创建对象设计一个类,只能在栈上创建对象设计一个类,不能被拷贝设计一个类,不能继承设计一个类,只能创建一个对象(单例模式)单例模式的概念单例模式的实现饿汉模式懒汉模式饿汉模式和懒汉模式的对比懒汉模式的优化单例对象的释放单例对象的直接释放内部垃圾回收类设计一个类,只能在堆上创建对象想要的效果实际是没法直接在栈上创建对象。首先cpp只要创建对象就要调用构造函数,因此先要把构造函数ban掉,把构造函数设计成private。但是单这样自己也创建不了了。因此提供一个创建的接口,只能原创 2022-01-30 12:43:19 · 1106 阅读 · 0 评论 -
哈希的应用(2)——布隆过滤器
文章目录布隆过滤器布隆过滤器的概念布隆过滤器的实现哈希函数个数和布隆过滤器长度模拟实现布隆过滤器的删除小结海量数据处理相关题5.1哈希切割5.2位图应用5.3布隆过滤器扩展布隆过滤器布隆过滤器的概念比如说一个论坛要实现注册功能,每个人都有昵称(主码)。现在新用户输入昵称或者修改昵称,提交的时候要如何快速检测一下昵称是否被用过?有人使用,则提示一下,没人使用,则提交成功。此时就是一个key的模型。比如说此时已经有100亿个用户昵称了。目前有两种方式:用哈希表存储用户记录,缺点:浪费空间。用位图原创 2022-01-29 23:50:45 · 3103 阅读 · 0 评论 -
哈希的应用(1)——位图
文章目录位图位图概念位图的实现相关应用位图位图概念给40亿个不重复的无符号整数,没排过序。给一个无符号整数,如何快速判断一个数是否在这40亿个数中。【腾讯】思路一:遍历,时间复杂度O(N)O(N)O(N)思路二: 排序O(NlogN)O(NlogN)O(NlogN),利用二分查找: O(logN)O(logN)O(logN)但是问题是,40亿个无符号整数,16G。压力很大。思路三:放进set或unordered_set,再查找。问题是空间撑不住,红黑树一个节点还有额外的空间,哈希的需要的原创 2022-01-29 15:58:58 · 889 阅读 · 0 评论 -
unordered_map和unordered_set的实现——哈希表实现及封装
文章目录1.两者与map及set的关系2.std::find和unordered_set::find3.随机数据测试4.底层结构4.1哈希概念4.2哈希冲突4.3哈希函数4.3.1直接定址法(常用)4.3.2除留余数法(常用)5.解决哈希冲突5.1闭散列——开放定址法5.1.1线性探测5.1.2二次探测5.1.3负载因子5.1.4模拟实现5.1.4.1判空5.1.4.2取模的选择5.1.4.3扩容的要求5.1.4.4仿函数处理各种类型转成整数5.1.5小结5.2开散列——哈希桶/拉链法5.2.1概念5.2.原创 2022-01-29 12:18:22 · 873 阅读 · 0 评论 -
map和set的实现(1)——AVL树
文章目录1.AVL树的实现1.1AVL树的概念1.2AVL树节点的定义1.3AVL树的插入1.3.1控制平衡1.3.1控制平衡因子1.3.2四种旋转1.3.2.1右单旋1.3.2.2左单旋1.3.2.3左右双旋1.3.2.4右左双旋1.3.2.5总结1.4AVL树的平衡检查1.5AVL树的查找1.6AVL树的拷贝,赋值,析构1.7AVL树的operator[]修改1.8AVL树的删除2.AVL树的性质2.1AVL树的性能前面对map/multimap/set/multiset进行了介绍,这几个容器有个共原创 2022-01-28 22:04:25 · 805 阅读 · 0 评论 -
map和set的实现(3)——红黑树封装
我们前面写的红黑树是k-v结构的,但是set是k结构的,如何保证复用性的情况下进行封装。学习源码要先看框架,框架看懂了细节就容易多了。文章目录红黑树结构的复用源码的复用框架key和key-value的比较碰到的问题仿函数实现两种类型的各自比较迭代器的实现迭代器的结构operator++/--的实现带头节点不带头节点反向迭代器的实现(迭代器适配器)operator[]的访问代码红黑树结构的复用源码的复用框架RBTree.h#pragma once#include <iostream>原创 2022-01-27 15:25:32 · 686 阅读 · 0 评论 -
C++list类的模拟实现
本文是对之前list类的模拟实现的重制。文章目录整体框架Alloc内存池iterator类iterator的意义iterator的实现operator=&&拷贝析构iterator的三个模板参数operator->的编译器省略List的拷贝构造析构等list接口的基本实现string,vector,list的迭代器整体框架namespace YCB{ //模拟实现list当中的结点类 template<class T> struct _list_node {原创 2022-01-26 22:29:27 · 708 阅读 · 0 评论 -
C++set、map、multiset、multimap的使用
文章目录1.关联式容器2.树形结构和哈希结构3.set3.1set的介绍3.2set的构造3.3set的迭代器3.4set的常用成员函数4.multiset5.map5.1map的介绍5.2pair和make_pair5.3map的构造5.4map的插入5.5map的遍历5.6map的修改5.7map的删除5.8operator[]与map经典场景5.8.1统计次数的方式一5.8.2统计次数的方式二5.8.3统计次数的方式三(operator[])5.8.3.1operator[]的底层原理5.8.3.2o原创 2022-01-24 16:02:12 · 752 阅读 · 0 评论 -
C++二叉搜索树
文章目录二叉搜索树二叉搜索树的概念二叉搜索树操作定义非递归版插入中序遍历查找删除递归版本查找插入删除类的默认成员函数析构拷贝构造operator=赋值二叉搜索树的应用K模型KV模型二叉搜索树二叉搜索树的概念二叉搜索树又称二叉排序树(因为走中序,数据都是有序的),它或者是一棵空树,或者是具有以下性质的二叉树。若它的左子树不为空,则左子树上所有节点的值都小于根节点的值若它的右子树不为空,则右子树上所有节点的值都大于根节点的值它的左右子树也分别为二叉搜索树即每颗子树中,左子树中值都小于根,右子树原创 2022-01-24 10:18:25 · 953 阅读 · 0 评论 -
C++多态
多态x86中涉及的指针是4bytes,有些平台下比如x64就要考虑指针是8bytes的问题文章目录多态1.多态的概念1.1概念2.多态的定义及实现2.1多态的构成条件2.2虚函数2.3虚函数的重写2.4虚函数重写的两个例外2.4.1协变(基类与派生类虚函数返回值类型不同)2.4.2析构函数的重写(基类和派生类的名字不同)2.5c++11的override和final2.6重载、覆盖(重写)、隐藏(重定义)的对比3.抽象类3.1概念3.2接口继承和实现继承4.多态的原理4.1原理的解释4.2虚表的深入原创 2022-01-22 15:32:48 · 678 阅读 · 0 评论 -
C++继承
继承文章目录继承1.继承的概念及定义1.1继承的概念1.2继承定义1.2.1继承格式1.2.2继承关系和访问限定符1.2.3继承基类成员访问方式的变化2.基类和派生类对象赋值转换3.继承中的作用域隐藏(重定义)的定义和特性隐藏和重载的区别4.派生类的4个默认成员函数4.1派生类的默认构造函数4.2派生类的默认拷贝构造函数4.3派生类的默认赋值函数4.4派生类的默认析构函数4.5总结5.继承与友元6.继承与静态成员7.复杂的菱形继承及菱形虚拟继承7.1菱形继承的问题以及解决方案7.2虚拟继承的底层机理8.继原创 2022-01-22 14:32:56 · 361 阅读 · 0 评论 -
C++STL——string类的模拟实现
string类的实现文章目录string类的实现默认成员函数构造函数拷贝构造函数传统写法现代写法赋值运算符重载传统写法现代写法析构函数迭代器相关函数begin和end容量和大小相关函数size和capacityreserve和resizeempty字符串修改相关函数insertpush_backappendoperator+=eraseclearswap字符串访问相关函数c_strfrontbackoperator[]findrfind关系运算符重载流运算符重载输出输入getline补充const使用的小原创 2022-01-22 11:37:06 · 419 阅读 · 0 评论 -
C++模板——函数模板与类模板
文章目录1.泛型编程2.函数模板2.1函数模板的概念2.2函数模板的格式2.4函数模板的实例2.3函数模板的原理2.4函数模板的实例化2.4.1隐式实例化2.4.2显式实例化2.5模板的参数匹配原则2.5.1非模板函数和同名函数模板2.5.2模板函数不允许自动类型转换3.类模板3.1类模板的定义格式3.2类模板的实例化4.C++模板对C的改进1.泛型编程泛型编程:编写与类型无关的通用代码,是代码复用的一种手段。模板是泛型编程的基础。2.函数模板2.1函数模板的概念函数模板代表了一个函数家族,该函数原创 2022-01-21 16:06:13 · 691 阅读 · 0 评论 -
C++内存管理
文章目录1.C/C++内存分布2.C语言中动态内存管理方式2.1malloc/calloc/realloc和free3.C++内存管理方式3.1C++出现new和delete的原因3.2new/delete操作内置类型3.2.1动态申请单个内置类型3.2.2动态申请多个内置类型3.3new和delete的操作自定义类型3.3.1new操作自定义类型3.3.2delete操作自定义类型3.3.3new和malloc,delete和free混用存在的问题3.4new和delete的底层原理3.4.1operat原创 2022-01-21 14:58:00 · 525 阅读 · 0 评论 -
类和对象(2)
这一部分的语法会存在怪怪的,但不必纠结。记住即可。文章目录1.类的6个默认成员函数1.构造函数构造函数的概念特性实例构造函数的存在场景构造函数的重载全缺省方式及注意编译器生成的默认构造函数的作用成员变量的命名风格2.析构函数2.1概念2.2特性析构函数存在场景构造析构的顺序编译器生成的默认析构函数的作用编译器生成的默认析构函数价值3.拷贝构造函数3.1概念3.2特征3.3拷贝构造的无穷递归3.4加上const的原因3.5编译器默认生成的的拷贝构造——浅拷贝3.6编译器默认生成的拷贝构造作用4.运算符重载4原创 2022-01-21 11:55:31 · 78 阅读 · 0 评论 -
stack、queue及priority_queue的模拟
主要学习的是容器适配器和仿函数,以及堆数据结构的回顾以及实践模拟容器适配器类似接口,实际上是一种设计模式,将已有的容器进行封装与改造,大大提高了复用性。仿函数是用起来像函数一样的类的方法,其重载了(),主要是用于简便函数指针的写法。用来代替>、<的比较。堆的具体内容实际上是C数据结构的内容,将在C的堆模拟中提及deque的学习之后会进行知道了stack,queue,priority_queue是适配器之后,比如说以后要想要知道queue里面的全部元素,可以自己封..原创 2021-10-05 19:15:18 · 80 阅读 · 2 评论 -
vector的模拟实现+类型萃取
cpp的vector模拟实现实现的接口Member functions:vector (const allocator_type& alloc = allocator_type());~vector();vector& operator= (const vector& x);Iterators:begin()end()Capacity:size()resize()capacity()empty()Element access:operato原创 2021-09-29 19:53:49 · 99 阅读 · 0 评论 -
list的模拟实现
list类学习的主要是一个迭代器的封装。因为list和前面vector,string的物理空间状况不同。vector和string的物理空间是连续的。迭代器可以直接采用原生指针的解引用,++,- -等而list的空间分布不是连续的,因此直接++,- -,是访问不到实际的下一个结点,并且节点是一个struct,直接解引用也不是一个value。因此针对这种情况,我们将迭代器封装成一个类。对类进行运算符重载,仿佛迭代器可以像原生指针一样使用。这就是迭代器的封装性。迭代器的具体考虑迭代器遍历使.原创 2021-10-02 18:14:58 · 73 阅读 · 0 评论 -
C++string类的模拟实现
还会慢慢测试找bug的#pragma once#include <cassert>namespace YCB{ class string { public: typedef char* iterator; static size_t npos; iterator begin(){ return _str; } iterator end(){ return (_str+_size); } //构造 string(const char原创 2021-09-24 15:01:06 · 92 阅读 · 0 评论 -
linux下extern“C”的使用
文章目录extern “C”1.C++程序中调用C库2.C程序中调用C++函数extern “C”vs下实现静态库:包含对应目录下的头文件在工程属性中配置静态库目录(链接器的常规中),添加静态库(链接器的输入中)Cpp调C:在Cpp的#include"…/xxx/xx.h"上下加上extern “C”{}extern "C"{ #include"../xx/Stack.h"}C调Cpp:在Cpp的.h文件中加extern “C”{ 函数},Cpp静态库就会按照C的规则去处理以原创 2022-01-15 18:45:37 · 1611 阅读 · 0 评论 -
类和对象(3)
文章目录1.再谈构造函数1.1构造函数体赋值1.2初始化列表1.2.1初始化列表的用法1.2.2初始化列表的意义const成员变量引用变量没有默认构造函数的自定义类型成员变量1.2.3初始化列表的注意1.2.3.1初始化列表和函数体内赋值并不是非此即彼的1.2.3.2默认的隐含初始化列表1.2.3.3成员变量的定义次序1.3explicit关键字(禁止隐式类型转化)1.3.1隐式类型转换1.3.2强制类型转换1.3.3类的单参数隐式类型转换1.3.4多参数的隐式类型转换--c++111.3.5禁止隐式类型转原创 2022-01-20 16:13:28 · 355 阅读 · 0 评论 -
C++find_if(解决针对查找的对象中包含指针需要进行比较问题)
背景:做课程设计的时候碰到了一个需要对vector<File*>类型进行寻找某一个File的name是要找的问题。然后处理了一会儿没解决。最后找到了。记录一下find_if针对查找的对象中包含指针需要进行比较find则更偏向于普通的数值或者字符比较两者都可以应用于自定义的类,只需在类中重载==运载符同时注意可能会和仿函数配合使用。所谓仿函数是C++对C语言的函数指针的一个封装。也就是对“()”这个函数调用符的重载。函数调用符()说白了其实就是代替函数指针,调.原创 2021-11-29 19:31:38 · 1651 阅读 · 1 评论 -
c++IO流
IO流C语言的输入与输出流是什么CppIO流stringstream的介绍1.C语言的输入与输出C语言中我们用到的最频繁的输入输出方式就是scanf ()与printf()。其他还有文件读写的接口,网络中API。scanf(): 从标准输入设备(键盘)读取数据,并将值存放在变量中。printf(): 将指定的文字/字符串输出到标准输出设备(屏幕)。注意宽度输出和精度输出控制。C语言借助了相应的缓冲区来进行输入与输出。IO:输入输出设备:磁盘,网卡,显示器IO接口函数屏蔽底层原创 2021-11-17 14:12:33 · 876 阅读 · 0 评论 -
C++基础部分
C++基础主要C++解决C语言的一些缺陷。文章目录C++基础2.命名空间2.1三种使用方式3.c++输入&输出4.缺省参数4.1全缺省4.2半缺省4.3缺省的注意事项5.函数重载5.1函数重载概念5.1.1重载的判定5.1.2调用存在歧义5.2重载的实现(名字修饰)5.3extern “C”6.引用6.1引用概念6.2引用特性6.3常引用6.4引用场景1、引用做参数2、引用做返回值6.5传值,传引用的效率比较6.6引用和指针的区别7.内联函数8.auto关键字(C++11)8.1auto简介8.原创 2021-11-28 15:40:37 · 9259 阅读 · 1 评论 -
类和对象(1)
文章目录1.类的6个默认成员函数1.构造函数构造函数的概念特性实例构造函数的存在场景构造函数的重载全缺省方式及注意编译器生成的默认构造函数的作用成员变量的命名风格2.析构函数2.1概念2.2特性析构函数存在场景构造析构的顺序编译器生成的默认析构函数的作用编译器生成的默认析构函数价值3.拷贝构造函数3.1概念3.2特征3.3拷贝构造的无穷递归3.4加上const的原因3.5编译器默认生成的的拷贝构造——浅拷贝3.6编译器默认生成的拷贝构造作用1.类的6个默认成员函数如果一个类中什么成员都没有,简称为空类。原创 2022-01-15 18:39:01 · 214 阅读 · 0 评论 -
C++练习--日期类
#include<iostream>#include<algorithm>using namespace std;class Date{public: bool isYear(int year) { if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) return true; return false; } int getMaxDays(int year, int m.原创 2021-09-08 12:02:17 · 160 阅读 · 0 评论