
C++
文章平均质量分 91
从零开始的C++
小倪同学 -_-
天道酬勤当至理,恒心定得上琼楼
展开
-
【实战项目】高并发内存池
文章目录项目介绍内存池技术设计一个定长的内存池高并发内存池整体框架设计thread cachethread cache整体框架threadcache哈希桶映射对齐规则thread cache申请内存项目介绍当前项目是实现一个高并发的内存池,他的原型是google的一个开源项目tcmalloc,tcmalloc全称Thread-Caching Malloc,即线程缓存的malloc,实现了高效的多线程内存管理,用于替代系统的内存分配相关的函数(malloc、free)。这个项目是把tcmalloc最核原创 2022-05-07 10:34:59 · 1188 阅读 · 0 评论 -
C++的IO流
文章目录一级目录一级目录原创 2022-04-12 12:00:05 · 449 阅读 · 0 评论 -
C++智能指针
文章目录为什么需要智能指针?内存泄漏什么是内存泄漏,内存泄漏的危害内存泄漏分类(了解)如何避免内存泄漏智能指针的使用及原理RAII智能指针的原理auto_ptrunique_ptrshared_ptrC++11和boost中智能指针的关系为什么需要智能指针?为了解决内存泄漏的问题,C++中提出了智能指针。内存泄漏的产生原因有很多,即使我们正确的使用malloc和free关键字也有可能产生内存泄漏,如在malloc和free之间如果存在抛异常,那也会产生内存泄漏。这种问题被称为异常安全。例void原创 2022-04-05 14:47:37 · 3453 阅读 · 1 评论 -
C++的类型转换
文章目录C语言中的类型转换为什么C++需要四种类型转换C++强制类型转换static_cast类型转换reinterpret_castconst_castdynamic_castC语言中的类型转换在C语言中,如果赋值运算符左右两侧类型不同,或者形参与实参类型不匹配,或者返回值类型与接收返回值类型不一致时,就需要发生类型转化,C语言中总共有两种形式的类型转换:隐式类型转换和显式类型转换。隐式类型转化:编译器在编译阶段自动进行,能转就转,不能转就编译失败。显式类型转化:需要用户自己处理例:voi原创 2022-04-05 08:46:46 · 1247 阅读 · 0 评论 -
C++——异常
文章目录C语言传统的处理错误的方式C++异常概念异常的使用异常的抛出和捕获异常的重新抛出异常安全异常规范自定义异常体系C语言传统的处理错误的方式传统的错误处理机制:终止程序,如assert,缺陷:用户难以接受。如发生内存错误,除0错误时就会终止程序。返回错误码,缺陷:需要程序员自己去查找对应的错误。如系统的很多库的接口函数都是通过把错误码放到errno中,表示错误。C 标准库中setjmp和longjmp组合。实际中C语言基本都是使用返回错误码的方式处理错误,部分情况下使用终止程序处理非常严原创 2022-04-04 08:26:25 · 254 阅读 · 0 评论 -
C++11常用知识点(下)
文章目录lambda表达式lambda表达式lambda表达式语法函数对象与lambda表达式包装器function包装器bind线程库thread类的简单介绍线程函数参数原子性操作库(atomic)lock_guard与unique_lockmutex的种类lock_guardunique_lock两个线程交替打印,一个打印奇数,一个打印偶数lambda表达式在C++98中,如果想要对一个数据集合中的元素进行排序,可以使用std::sort方法。#include <algorithm>原创 2022-03-28 16:20:58 · 2012 阅读 · 0 评论 -
C++11常用知识点(上)
文章目录C++11简介统一的列表初始化{}初始化std::initializer_list声明autodecltypenullptr范围for循环STL中一些变化C++11简介在2003年C++标准委员会曾经提交了一份技术勘误表(简称TC1),使得C++03这个名字已经取代了C++98称为C++11之前的最新C++标准名称。不过由于C++03(TC1)主要是对C++98标准中的漏洞进行修复,语言的核心部分则没有改动,因此人们习惯性的把两个标准合并称为C++98/03标准。从C++0x到C++11,C++原创 2022-03-28 16:20:41 · 1001 阅读 · 0 评论 -
特殊类设计
文章目录请设计一个类,只能在堆上创建对象请设计一个类,只能在栈上创建对象请设计一个类,不能被拷贝请设计一个类,不能被继承请设计一个类,只能在堆上创建对象实现方式:将类的构造函数私有,拷贝构造声明成私有。防止别人调用拷贝在栈上生成对象。提供一个静态的成员函数,在该静态成员函数中完成堆对象的创建class OnlyHeap{public: // 2、提供一个static公有函数创建对象,对象创建的都在堆上 static OnlyHeap* CreateObj() { return n原创 2022-03-14 11:24:52 · 1003 阅读 · 0 评论 -
位图的应用
文章目录位图位图概念位图的实现布隆过滤器布隆过滤器概念布隆过滤器的实现布隆过滤器优点布隆过滤器缺陷海量数据面试题位图思考如下面试题给40亿个不重复的无符号整数,没排过序。给一个无符号整数,如何快速判断一个数是否在这40亿个数中。我们可能会想到遍历或排序+二分查找那我们想一下40亿个无符号整数占据多大空间呢?1G=1024MB=10241024KB=10241024*1024Byte1G大约为10亿字节,40亿个无符号整数需要160亿个字节大概16G的空间有没有什么办法能减小所用到的空间呢,这原创 2022-03-11 17:55:13 · 585 阅读 · 1 评论 -
unordered_map和unordered_set的模拟实现
文章目录一级目录哈希表模板参数哈希表成员函数的实现构造函数拷贝构造函数赋值运算符重载析构函数一级目录unordered_map和unordered_set底层是用哈希桶实现的,下面是模拟实现哈希表和哈希桶的代码。哈希表#pragma once#include<vector>// 闭散列namespace close_hash{ enum Status { EMPTY, EXITS, DELETE }; template<class K, class原创 2022-03-08 09:49:11 · 191 阅读 · 0 评论 -
map和set的模拟实现
文章目录红黑树代码红黑树模板参数红黑树节点的修改模板参数中的仿函数红黑树代码map和set底层是红黑树,下面是之前模拟实现红黑树的代码博主在红黑树的模拟实现一文的代码#pragma once// 节点的颜色enum Colour{ BLACK, RED};template<class K, class V>struct RBTreeNode{ RBTreeNode<K, V>* _left; // 左子节点 RBTreeNode<K, V>原创 2022-03-01 10:13:06 · 583 阅读 · 2 评论 -
红黑树的模拟实现
文章目录红黑树的概念红黑树的性质红黑树节点的定义红黑树的插入操作按照二叉搜索的树规则插入新节点调整红黑树红黑树的验证红黑树与AVL树的比较红黑树的概念红黑树,是一种二叉搜索树,但在每个结点上增加一个存储位表示结点的颜色,可以是Red或Black。 通过对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路径会比其他路径长出俩倍,因而是接近平衡的。红黑树的性质每个结点不是红色就是黑色。根节点是黑色的。如果一个节点是红色的,则它的两个孩子结点是黑色的。对于每个结点,从该结点到原创 2022-02-28 20:03:26 · 767 阅读 · 1 评论 -
AVL树的模拟实现
文章目录AVL树的概念AVL树节点的定义AVL树的插入AVL树的旋转右单旋左单旋先左单旋再右单旋先右单旋再左单旋AVL树的验证AVL树的性能AVL树的概念二叉搜索树虽可以缩短查找的效率,但如果数据有序或接近有序二叉搜索树将退化为单支树,查找元素相当于在顺序表中搜索元素,效率低下。因此,两位俄罗斯的数学家G.M.Adelson-Velskii和E.M.Landis在1962年发明了一种解决上述问题的方法:当向二叉搜索树中插入新结点后,如果能保证每个结点的左右子树高度之差的绝对值不超过1(需要对树中的结点进原创 2022-02-25 11:41:58 · 307 阅读 · 0 评论 -
二叉搜索树的模拟实现
文章目录二叉搜索树概念二叉搜索树的实现二叉搜索树的结点二叉搜索树的查找二叉搜索树的插入二叉搜索树的删除二叉搜索树其他成员函数二叉搜索树的性能分析二叉搜索树概念二叉搜索树又称二叉排序树,具有以下性质的二叉树:若它的左子树不为空,则左子树上所有节点的值都小于根节点的值若它的右子树不为空,则右子树上所有节点的值都大于根节点的值它的左右子树也分别为二叉搜索树如图就是一棵二叉搜索树二叉搜索树的实现二叉搜索树的结点二叉搜索树的结点和二叉树的结点类似,有两个指针分别指向左右子树,还有一个存储数据的原创 2022-02-21 23:14:53 · 660 阅读 · 0 评论 -
C++——map和set的简介及使用
文章目录关联式容器键值对setset的介绍set的使用set的模板参数列表set的构造set中常用的成员函数set中迭代器相关函数使用示例multisetmapmap的介绍map的使用map的模板参数说明map构造map的插入map的[ ]运算符重载关联式容器关联式容器包括序列式容器和关联式容器序列式容器: 底层为线性序列的数据结构,里面存储的是元素本身,包含vector、list、deque、forward_list(C++11)等。关联式容器: 里面存储的是<key, value>结原创 2022-02-21 10:20:49 · 2509 阅读 · 0 评论 -
继承和多态常见的问题
文章目录选择题问答题选择题下面哪种面向对象的方法可以让你变得富有( )A: 继承 B: 封装 C: 多态 D: 抽象( )是面向对象程序设计语言中的一种机制。这种机制实现了方法的定义与具体的对象无关,而对方法的调用则可以关联于具体的对象。A: 继承 B: 模板 C: 对象的自身引用 D: 动态绑定面向对象设计中的继承和组合,下面说法错误的是?()A:继承允许我们覆盖重写父类的实现细节,父类的实现对于子类是可见的,是一种静态复用,也称为白盒复用B:组合的对象不需要关心各自的实现细节原创 2022-01-30 10:45:56 · 1043 阅读 · 0 评论 -
C++——多态
文章目录多态的概念多态的定义及实现多态的构成条件虚函数虚函数的重写虚函数重写的两个例外多态的概念通俗来说,就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会产生出不同的状态。例如买票这个行为,当普通人买票时,是全价买票;学生买票时,是半价买票;军人买票时是优先买票。不同身份的人买票,所产生的行为是不同的,这就是多态。多态的定义及实现多态的构成条件多态是在不同继承关系的类对象,去调用同一函数,产生了不同的行为。比如Student继承了Person。Person对象买票全价,Studen原创 2022-01-29 15:37:01 · 974 阅读 · 0 评论 -
C++——继承
文章目录继承的概念及定义继承的概念继承定义定义格式继承关系和访问限定符继承基类成员访问方式的变化基类和派生类对象赋值转换继承中的作用域继承的概念及定义继承的概念继承(inheritance)是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承是类设计层次的复用。例如下面代码中Student和Teachar类就继承了Pe原创 2022-01-27 22:31:37 · 226 阅读 · 0 评论 -
C++——模板进阶
文章目录非类型模板参数模板的特化概念函数模板特化类模板特化全特化偏特化模板的分离编译什么是分离编译模板的分离编译解决方法模板总结非类型模板参数模板参数分类类型形参与非类型形参类型形参: 出现在模板参数列表中,跟在class或typename关键字之后的参数类型名称。非类型形参: 用一个常量作为类(函数)模板的一个参数,在类(函数)模板中可将该参数当成常量来使用。例:实现一个静态数组的类template<class T,size_t N>class array{public:原创 2022-01-22 17:44:59 · 160 阅读 · 0 评论 -
C++——priority_queue的使用与模拟实现
文章目录priority_queue的使用priority_queue简介priority_queue的使用priority_queue的模拟实现priority_queue的使用priority_queue文档介绍priority_queue简介优先队列是一种容器适配器,有严格的排序标准,它的第一个元素总是它所包含的元素中最大的(或最小的)。此上下文类似于堆,在堆中可以随时插入元素,并且只能检索最大堆(或 最小堆)元素(优先队列中位于顶部的元素)。默认情况下,如果没有为特定的priority原创 2022-01-07 16:13:28 · 1028 阅读 · 0 评论 -
C++——stack和queue的模拟实现
文章目录容器适配器stack的模拟实现queue容器的模拟实现容器适配器stack和queue没有自己独立的容器,而是对其他容器接口进行包装,STL中stack和queue默认使用的是deque容器,如下图。从stack和queue的类模板声明中可以看出,它的模板有两个参数第一个是所存储的数据类型,第二个是它们封装的容器类型,这里默认是deque容器。deque容器queue和stack的模拟实现主要是调用deque容器实现stack的模拟实现namespace nzb{ templ原创 2022-01-05 11:05:23 · 917 阅读 · 0 评论 -
C++——stack和queue的简介和使用
文章目录stack简介stack的使用queue简介queue的使用stack简介stack文档介绍stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行元素的插入与提取操作。stack的使用stack常用成员函数如下#include<iostream>#include<stack>using namespace std;int main(){ stack<int> st; st.push(2);//原创 2021-12-18 09:47:18 · 574 阅读 · 0 评论 -
C++——list的模拟实现
文章目录接口总览list结点的模拟实现list迭代器的模拟实现迭代器类的模板参数说明构造函数++运算符的重载- - 运算符的重载==运算符的重载!=运算符的重载*运算符的重载list的模拟实现默认成员函数构造函数迭代器相关函数接口总览namespace NZB{ // 模拟实现list结点 template<class T> struct _list_node { _list_node(const T& val = T()); // 构造结点 //成员变量 T原创 2021-11-18 21:21:19 · 921 阅读 · 2 评论 -
C++——list的简介及使用
文章目录list的简介list的使用list 的构造list 插入和删除数据push_front和pop_frontpush_back和pop_backinserteraselist 迭代器的使用list 获取数据list 容量list 相关操作函数swapclearsortresizeremoveuniquereverselist的简介list文档list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。list的底层是双向链表结构,双向链表中每个元素存储在互不原创 2021-11-13 22:36:06 · 28954 阅读 · 8 评论 -
C++——vector的模拟实现
文章目录vector接口总览默认成员函数构造函数拷贝构造赋值重载析构函数vector接口总览namespace nzb{ //模拟实现vector template<class T> class vector { public: typedef T* iterator; typedef const T* const_iterator; //默认成员函数 vector(); //构原创 2021-11-10 16:36:00 · 1506 阅读 · 4 评论 -
C++——vector的简介及使用
文章目录vector简介vector的使用vector的定义vector迭代器的使用begin和endrbegin和rendvector 空间增长size和capacityemptyreserve和resizevector 增删查改push_back和pop_backinsert和erasefindswapoperator[ ]vector迭代器失效问题底层空间改变导致迭代器失效指定位置元素的删除操作vector简介vector文档vector是表示可变大小数组的序列容器和数组一样,vector也原创 2021-11-05 19:37:26 · 1118 阅读 · 1 评论 -
C++——string类的模拟实现
文章目录深浅拷贝深浅拷贝浅拷贝:也称位拷贝,编译器只是将对象中的值拷贝过来。如果对象中管理资源,最后就会导致多个对象共享同一份资源。namespace A{ class string { public: string(const char* str) :_str(new char[strlen(str)+1]) { strcpy(_str, str); } ~string() { delete[] _str; _str = nullptr;原创 2021-11-03 18:17:56 · 673 阅读 · 0 评论 -
C++——string的简介及使用
文章目录string类对象的常见构造string类对象的容量操作string类对象的访问及遍历操作string类对象的修改操作string类对象的常见构造类对象的常见构造实例: string s1; // 构造空字符串 string s2("hello world"); // 拷贝"hello world" string s3("hello world", 4); // 拷贝"hello world"前4个字符 string s4(s2); // 拷贝构造s2stri原创 2021-10-28 15:43:42 · 291 阅读 · 1 评论 -
C++——初识模板
文章目录泛型编程函数模板函数模板概念函数模板格式函数模板的原理函数模板的实例化模板参数的匹配原则类模板类模板的定义格式类模板的实例化泛型编程泛型编程:编写与类型无关的通用代码,是代码复用的一种手段。模板是泛型编程的基础。在C++中如何写一个函数交换两个数呢?我们可以利用函数重载void Swap(int& left, int& right){ int temp = left; left = right; right = temp;}void Swap(double&am原创 2021-10-24 16:53:55 · 109 阅读 · 0 评论 -
C/C++内存管理
文章目录C/C++内存分布C/C++动态内存管理方式C/C++内存分布观察下面代码,你知道各个部分都在内存中哪个区吗?int globalVar = 1;static int staticGlobalVar = 1;void Test(){ static int staticVar = 1; int localVar = 1; int num1[10] = { 1, 2, 3, 4 }; char char2[] = "abcd"; char* pChar3 = "abcd"; in原创 2021-10-21 17:24:09 · 110 阅读 · 0 评论 -
C++类和对象(3)
文章目录再谈构造函数构造函数体赋值初始化列表explicit关键字static成员概念特性static的作用友元友元函数再谈构造函数构造函数体赋值在创建对象时,编译器通过调用构造函数,给对象中各个成员变量一个合适的初始值class Date{public: Date(int year=2000, int month=1, int day=1) { _year = year; _month = month; _day = day; }private: int _year;原创 2021-10-19 16:36:22 · 157 阅读 · 0 评论 -
日期——类的实现
文章目录类的定义和各种操作符声明获取指定月的天数日期的构造函数拷贝构造函数日期+=天数日期+天数日期-=天数日期-天数前置++后置++前置--后置-->运算符重载==运算符重载>=运算符重载<运算符重载<=运算符重载!=运算符重载日期-日期类的定义和各种操作符声明class Date{public: // 获取某年某月的天数 int GetMonthDay(int year, int month); // 全缺省的构造函数 Date(int y原创 2021-10-15 17:34:48 · 189 阅读 · 0 评论 -
C++类和对象(2)
文章目录1.类的6个默认成员函数2.构造函数2.1 概念1.类的6个默认成员函数如果一个类中什么成员都没有,简称为空类。空类中什么都没有吗?并不是的,任何一个类在我们不写的情况下,都会自动生成下面6个默认成员函数。2.构造函数2.1 概念构造函数是一个特殊的成员函数,名字与类名相同,创建类类型对象时由编译器自动调用,保证每个数据成员都有 一个合适的初始值,并且在对象的生命周期内只调用一次。...............原创 2021-10-15 09:23:55 · 138 阅读 · 0 评论 -
C++类和对象(1)
文章目录类的引入类的定义类的访问限定符及封装访问限定符类的封装类的作用域类的实例化类对象模型如何计算类对象的大小类对象的存储方式猜测结构体内存对齐规则this指针this指针的引出this指针的特性类的引入C语言中,结构体中只能定义变量,在C++中,结构体内不仅可以定义变量,也可以定义函数。例:struct test{ // 定义变量 int a = 10; double b = 3.14; // 定义函数 int ADD(int x, int y) { return x + y;原创 2021-10-11 16:13:01 · 121 阅读 · 0 评论 -
C++入门
文章目录C++关键字命名空间命名空间定义命名空间使用C++的输入和输出缺省参数缺省参数概念缺省参数分类C++关键字C++总计63个关键字,C语言32个关键字命名空间在C/C++中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存在于全局作用域中,可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染,namespace关键字的出现就是针对这种问题的。命名空间定义定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字原创 2021-10-01 14:30:10 · 176 阅读 · 0 评论