![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
c++
文章平均质量分 74
期待777
这个作者很懒,什么都没留下…
展开
-
各种锁的介绍
文章目录互斥锁条件锁(条件变量)读写锁读写锁的特性:自旋锁互斥锁mutex(mutual exclusive)即互斥量(互斥体),也便是常说的互斥锁。其思想简单粗暴,多线程共享一个互斥量,然后线程之间去竞争。得到锁的线程可以进入临界区执行代码。mutex是睡眠等待(sleep waiting)类型的锁,当线程抢互斥锁失败的时候,线程会陷入休眠。优点就是节省CPU资源,缺点就是休眠唤醒会消耗一点时间。// 声明一个互斥量 pthread_mutex_t mtx;// 初始化 pthr.原创 2021-10-04 11:28:01 · 198 阅读 · 0 评论 -
C++知识点复习(持续更新....)
1.缺省参数需要注意什么?必须从右往左给,不能间隔缺省值必须是常量或者全局变量C语言不支持(编译器不支持)2.什么是重载?为什么C++支持C不支持呢?重载就是在同一作用域下函数名相同,参数(个数,顺序,类型)不同的函数,常用来处理功能相似,数据类型不同的问题C语言同名函数是没有办法区分,C++采用函数修饰规则来区分,只要参数不同修饰出来的名字就不同,因此支持了重载3.extern"C"是什么?将函数按照C语言规则来修饰4.引用是什么?引用有哪些特性?引用不是定义一个新变量,原创 2021-03-20 21:33:58 · 232 阅读 · 0 评论 -
c++的类型转换
文章目录前言c++类型转换1.static_cast2.reinterpret_cast3.const_cast4.dynamic_cast总结前言c支持两种类型转化:隐式类型转换,强制类型转换int main(){ int i = 1; double d = 8.88; i = d; // c语言支持相近类型的隐式类型转换 (相近类型,也就是意义相似的类型) cout << i << endl; int* p = nullptr; p = (int*)i;原创 2020-11-01 19:40:08 · 94 阅读 · 0 评论 -
c++ 单例模式
文章目录前言一、单例模式是什么?二、饿汉模式三、懒汉模式总结前言设计模式(Design Pattern)是一套被反复使用、多数人知晓的、经过分类的、代码设计经验的总结。为什么会产生设计模式这样的东西呢?就像人类历史发展会产生兵法。最开始部落之间打仗时都是人拼人的对砍。后来春秋战国时期,七国之间经常打仗,就发现打仗也是有套路的,后来孙子就总结出了《孙子兵法》。孙子兵法也是类似。使用设计模式的目的:为了代码可重用性、让代码更容易被他人理解、保证代码可靠性。 设计模式使代码编写真正工程化;设计模式是原创 2020-10-30 20:47:48 · 110 阅读 · 0 评论 -
C++特殊类设计
文章目录前言一、请设计一个类,只能在堆上创建对象?二、请设计一个类,只能在栈上创建对象?三、请设计一个类,不能被拷贝?四、请设计一个类,不能被继承?总结前言特殊类设计一、请设计一个类,只能在堆上创建对象?实现方式:将类的构造函数私有,拷贝构造声明成私有。防止别人调用拷贝在栈上生成对象。提供一个静态的成员函数,在该静态成员函数中完成堆对象的创建//思路:正常创建对象一定要调用构造函数,或者拷贝构造,class HeapOnly{public: static HeapOnly* Ge原创 2020-10-30 17:15:04 · 90 阅读 · 0 评论 -
c++智能指针
文章目录前言一、RAII是什么?二、智能指针的原理1.c++98 auto_ptr2.c++11 unique_ptr3.c++11 shared_ptr三.循环引用总结前言c++没有gc,new/malloc等等出来的资源,是需要我们去手动释放1.忘记释放2.发生异常安全问题new/mallocfunc();//throw异常delete/free最终都会导致资源泄漏一、RAII是什么?RAII是一种利用对象生命周期来控制程序资源的思想在对象构造时获取资源,接着控制对资源的访问使之原创 2020-10-30 14:59:14 · 123 阅读 · 1 评论 -
c++ lamber表达式
文章目录前言一、lamber是什么?二、举例总结前言template<class T>struct Greater{ bool operator()(const T& x1, const T& x2) { return x1 > x2; }};bool g2(const int& x1, const int& x2){ return x1 > x2;}int x4(){ int array[] = { 4, 1,原创 2020-10-28 19:28:24 · 851 阅读 · 0 评论 -
C++右值引用
文章目录前言一、右值引用是什么?二、右值区分与应用?1.应用:右值引用的移动构造和移动赋值,可以减少拷贝2.应用:当传值返回值,返回是右值,结合前面学的移动构造和移动赋值.3.应用:右值引用去做函数的参数,减少拷贝三、完美转发1.没使用完美转发2.使用forward后总结前言C++98中提出了引用的概念,引用即别名,引用变量与其引用实体公共同一块内存空间,而引用的底层是通过指针来实现的,因此使用引用,可以提高程序的可读性。一、右值引用是什么?为了提高程序运行效率,C++11中引入了右值引用,右值原创 2020-10-28 17:42:39 · 212 阅读 · 0 评论 -
c++异常
文章目录前言一、异常是什么?二、C语言传统的处理错误的方式有哪些呢?1.返回错误码2.终止程序三、传统的处理错误的缺陷?四、异常的使用?1.异常的抛出和捕获2.异常重新抛出五、自定义异常体系总结前言许多的学员对异常处理视而不见,程序里很少考虑异常情况。一部分人甚至根本就不考虑,以为程序总是能以正确的途径运行。例如我们有的学员调用fopen打开一个文件后,立马就开始进行读写操作,根本就不考虑文件是否正常打开了。这种习惯一定要改掉,纵使你再不愿意!这是软件健壮性的需要!异常处理不是浪费时间!一、异常是什原创 2020-10-27 20:29:50 · 85 阅读 · 0 评论 -
c++ 海量数据处理
文章目录前言一、位图应用1. 给定100亿个整数,设计算法找到只出现一次的整数?2. 给两个文件,分别有100亿个整数,我们只有1G内存,如何找到两个文件交集?3. 位图应用变形:1个文件有100亿个int,1G内存,设计算法找到出现次数不超过2次的所有整数?二、布隆过滤器应用1. 给两个文件,分别有100亿个query,我们只有1G内存,如何找到两个文件交集?分别给出精确算法和近似算法2.如何扩展BloomFilter使得它支持删除元素的操作三.哈希切分总结前言当面对海量数据时,我们的内存是不够用的原创 2020-10-27 16:26:57 · 727 阅读 · 0 评论 -
c++布隆过滤器
文章目录前言一、布隆过滤器是什么?二、布隆过滤器实现1.代码2.布隆过滤器优缺点总结前言在学习到位图的高效后,我们又会思考一个问题,就是位图只能处理整数,那如果数据是字符串呢?我们又该如何解决?例子:我们在刷短视频时,它会给我们不停地推荐新的内容,它每次推荐时要去重,去掉那些已经看过的内容。问题来了,推荐系统如何实现推送去重的? 用服务器记录了用户看过的所有历史记录,当推荐系统推荐视频时会从每个用户的历史记录里进行筛选,过滤掉那些已经存在的记录。 如何快速查找呢?用哈希表存储用户记录,缺点:浪费原创 2020-10-26 21:31:17 · 338 阅读 · 0 评论 -
c++ 位图
文章目录前言一、位图是什么?二、问题1.问题分析2.代码实现位图三、位图的应用总结前言还记得上个内容哈希留下的问题嘛?这里我将总结位图知识,并且解决问题!一、位图是什么?位图就是用每一位来存放某种状态,适用于海量数据,数据无重复的场景。通常是用来判断某个数据存不存在的。二、问题1.问题分析面试题:给40亿个不重复的无符号整数,没排过序。给一个无符号整数,如何快速判断一个数是否在这40亿个数中。1.遍历,时间复杂度O(N)2.排序(O(NlogN)),利用二分查找: logN3.位图原创 2020-10-26 20:27:42 · 263 阅读 · 0 评论 -
c++ 哈希表
文章目录前言一、什么是哈希/散列?二、什么是哈希冲突?如何解决1.开放定制法(闭散列)2.拉链法(开散列)三、如果哈希表中冲突得很厉害怎么办?四、unordered_map和unordered_set跟map/set的区别?总结面试题:前言在学习完map和set后,我们会惊讶于它的效率O(logn)。但是unordered_map和unordered_set的效率是O(1),而它的底层原理就是哈希表一、什么是哈希/散列?构造一种存储结构,通过某种函数使元素的存储位置与它的关键码之间能够建立一一映原创 2020-10-26 11:10:00 · 538 阅读 · 0 评论 -
c++ 红黑树实现 map和set的底层原理
文章目录前言一、红黑树是什么?二、红黑树的特性1.根节点是黑色的2.叶子节点(null)是黑色的3.每个结点不是黑色就是红色4.一个结点是红色的,他的两个子节点一定是黑色的5.对于每个结点,从该节点到所有后代叶节点的简单路径上,均包含相同数目的黑节点三、红黑树的实现四、map底层的实现代码测试五、set底层的实现代码测试总结前言上一个博客总结了AVL树,链接: AVL树实现.但是当需要大量增删的时候,AVL树旋转次数太多,效率并不高。所以我们引入了红黑树,红黑树不是绝对的平衡二叉树,但实现起来简单.原创 2020-10-24 10:47:02 · 1276 阅读 · 1 评论 -
c++ AVLTree平衡二叉搜索树
AVL树前言二叉搜索树虽可以缩短查找的效率,但如果数据有序或接近有序二叉搜索树将退化为单支树,查找元素相当于在顺序表中搜索元素,效率低下。一、AVL是什么?当向二叉搜索树中插入新结点后,如果能保证每个结点的左右子树高度之差的绝对值不超过1(需要对树中的结点进行调整),即可降低树的高度,从而减少平均搜索长度。二、满足条件1.它的左右子树都是AVL树2.左右子树高度之差(简称平衡因子)的绝对值不超过1(-1/0/1)三、实现AVL树#pragma oncetemplate<clas原创 2020-10-22 21:46:56 · 276 阅读 · 0 评论 -
map和set
map和setmap和set都是关联容器,和vector、list之类的不同,map和set一次存两个值,存的是是一个键值对,对于map存的是<key,value>,对于set存的是<value,value> 。键值对template <class T1, class T2>struct pair{ typedef T1 first_type; typedef T2 second_type; T1 first; T2 second; pair(): f原创 2020-10-22 08:47:27 · 117 阅读 · 0 评论 -
c++ 二叉搜索树
在这里为什么我们需要学习二叉搜索树呢?map和set特性需要先铺垫二叉搜索树,而二叉搜索树也是一种树形结构。二叉搜索树的特性了解,有助于更好的理解map和set。1.二叉搜索树1.1 二叉搜索树概念二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树:若它的左子树不为空,则左子树上所有节点的值都小于根节点的值若它的右子树不为空,则右子树上所有节点的值都大于根节点的值它的左右子树也分别为二叉搜索树int a [] = {5,3,4,1,7,8,2,6,0,9};1.原创 2020-06-22 17:41:30 · 266 阅读 · 0 评论 -
C++ 多态的详细知识点总结
1. 多态的概念1.1 概念多态的概念:通俗来说,就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会产生出不同的状态。举个例子:比如买票这个行为,当普通人买票时,是全价买票;学生买票时,是半价买票;军人买票时是优先买票。2. 多态的定义及实现2.1多态的构成条件多态是在不同继承关系的类对象,去调用同一函数,产生了不同的行为。比如Student继承了Person。Person对象买票全价,Student对象买票半价。那么在继承中要构成多态还有两个条件:1. 必须通过基类的指针或者引原创 2020-06-19 16:12:28 · 306 阅读 · 0 评论 -
C++ 继承的详细知识点总结
1.继承的概念及定义1.1继承的概念继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承是类设计层次的复用。#include<iostream>using namespace std;#include<string>class person{public:原创 2020-06-16 21:21:32 · 208 阅读 · 0 评论 -
C++ vector的基本使用规则
文章目录vector的介绍vector的使用vector 定义vector iterator的使用vector 空间增长问题vector 增删查改vector的介绍vector是表示可变大小数组的序列容器。像数组一样,vector也是采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问,和数组一样高效。但是又不像数组,它的大小是可以动态改变的,而且它的大小会被容器自动处理。vector使用动态分配数组来存储它的元素。vector分配空间策略:vector会分配.原创 2020-12-30 21:28:15 · 172 阅读 · 0 评论 -
C++ string类 模拟实现全代码过程
string类的模拟实现上篇已经对string类进行了简单的介绍,大家只要能够正常使用即可。在模拟实现中最主要是实现string类的构造、拷贝构造、赋值运算符重载以及析构函数。大家看下以下string类的实现是否有问题?说明:上述string类没有显式定义其拷贝构造函数与赋值运算符重载,此时编译器会合成默认的,当用s1构造s2时,编译器会调用默认的拷贝构造。最终导致的问题是,s1、s2共用同一块内存空间,在释放时同一块空间被释放多次而引起程序崩溃,这种拷贝方式,称为浅拷贝。1.浅拷贝也称位拷贝原创 2020-09-21 19:10:57 · 83 阅读 · 0 评论 -
C++ string类的基本日常使用规则
string类在使用string类时,必须包含#include头文件以及using namespace std;1.string类的常用接口说明函数名称功能说明string()构造空的string类对象,即空字符串string(const char* s)用C-string来构造string类对象string(const string&s)拷贝构造函数void Teststring(){string s1; // 构造空的string类对象s1原创 2020-09-14 11:15:58 · 95 阅读 · 0 评论 -
C++ 模板的使用规则(函数模板,类模板)
为什么我们需要学习模板呢?话不多说,看下列代码void Swap(int& left, int& right){ int temp = left; left = right; right = temp;}void Swap(double& left, double& right){ double temp = left; left = right; right = temp;}void Swap(char& left, char& r原创 2020-09-12 23:14:08 · 432 阅读 · 0 评论 -
详细说明C和C++内存管理的相同点与不同点
1.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"; int* ptr1 = (int*)malloc(sizeof (int)* 4);原创 2020-09-12 17:08:43 · 242 阅读 · 0 评论 -
C++完整日期类的超详细实现代码
当我们刚学习C++时,我们初学者还是非常难理解类与对象。那么我们如何来深刻的理解呢? 我认为比较好理解就是实现日期类的代码。代码如下:...原创 2020-06-10 00:49:59 · 453 阅读 · 0 评论 -
C++类与对象- - -初始化列表,static,友元详解
【本节目标】1.再谈构造函数2.C++11 的成员初始化新玩法。3. 友元4. static成员5. 内部类1.再谈构造函数1.1 构造函数体赋值在创建对象时,编译器通过调用构造函数,给对象中各个成员变量一个合适的初始值。class Date{public: Date(int year, int month, int day) { _year = year; _month = month; _day = day; }private: int _year; int原创 2020-06-10 17:55:29 · 243 阅读 · 0 评论 -
c++类与对象- - -赋值运算符重载,const特性详解
5.赋值运算符重载5.1 运算符重载C++为了增强代码的可读性引入了运算符重载,运算符重载是具有特殊函数名的函数,也具有其返回值类型,函数名字以及参数列表,其返回值类型与参数列表与普通的函数类似。函数名字为:关键字operator后面接需要重载的运算符符号。函数原型:返回值类型 operator操作符(参数列表)注意:1.不能通过连接其他符号来创建新的操作符:比如operator@2....原创 2020-06-10 00:44:23 · 242 阅读 · 0 评论 -
C++类与对象- - -构造,析构,拷贝构造函数详解
类与对象(中)1.类的6个默认成员函数2.构造函数3.析构函数4.拷贝构造函数5.赋值操作符重载6.const成员函数7.取地址及const取地址操作符重载1.类的6个默认成员函数如果一个类中什么成员都没有,简称为空类。空类中什么都没有吗?并不是的,任何一个类在我们不写的情况下,都会自动生成下面6个默认成员函数。class Date{};2. 构造函数2.1 概念对...原创 2020-05-07 01:01:15 · 220 阅读 · 0 评论 -
C++类与对象- - -类大小计算与this指针详解
1.面向过程和面向对象初步认识 C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。C++是基于面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完成。2.类的定义class className{ //有成员函数和成员变量组成};//注意分号class为定义类的关键字,ClassName为类的名字,{}中为类的主体,注意类定...原创 2020-04-13 23:13:47 · 290 阅读 · 0 评论 -
C++入门知识点- - -重载,缺省参数,引用等详解
1.命名空间 在C/C++中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存在于全局作用域中,可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染,namespace关键字的出现就是针对这种问题的。1.1 命名空间的定义 定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{}中即为命...原创 2020-04-13 17:32:21 · 295 阅读 · 1 评论