![](https://img-blog.csdnimg.cn/20201014180756738.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C++
文章平均质量分 53
幽萌之雨
上班族
展开
-
C++指针与const的结合用法
C++指针与constint main(){ int a = 10, b = 20; int* p = &a; *p = 100;//对 p = &b;//对}int main(){ int a = 10, b = 20; const int* p = &a; *p = 100;//错 p = &b;//对}int main(){ int a = 10, b = 20; int* const p = &a; *p = 100;/原创 2022-01-07 15:50:16 · 163 阅读 · 0 评论 -
C++之构造函数
1.什么是构造函数?创建一个对象之后,就需要初始化该对象,构造函数就是用来初始化该对象的。2.构造函数有什么作用?构造函数的作用是初始化对象的数据成员。类对象被创建的时候,编译系统为对象分配内存空间,并自动调用该构造函数,由构造函数完成初始化工作。3.构造函数的分类有哪些?无参构造函数待默认值的构造函数有参构造函数拷贝构造函数一种特殊的构造函数,当对象之间复制时会自动调用拷贝构造函数若类中没有定义拷贝构造函数,系统会自动生成一个拷贝构造函数拷贝构造函数具有单个形参,该形参(常用co原创 2021-11-13 23:03:35 · 931 阅读 · 0 评论 -
C++this指针和函数调用
C++this指针和函数调用之前对this指针只是有所耳闻,但当真正使用时确是半知半解,今天有幸听了一位老师的详细讲解,总算是搞懂了了它,下面我将我的学习笔记分享给大家,希望对大家理解this指针有所帮助。下面是一个求矩形面积的程序,以这个程序为例,来做this指针和函数调用的介绍#include<stdio.h>#include<iostream>using namespace std;class Rectangle{private: int m_wide;原创 2021-10-24 18:12:04 · 3024 阅读 · 0 评论 -
Radis
RadisSDS原创 2021-10-05 20:06:10 · 276 阅读 · 0 评论 -
C++小项目之大数相加减
#pragma once#ifndef BIG_NUM_H//防止重定义#define BIG_NUM_H#include<iostream>#include<string>using namespace std;class BigNum{public: BigNum(int num = 0); BigNum(const string& str); BigNum(const BigNum& src); BigNum& operator原创 2021-11-28 16:26:11 · 608 阅读 · 0 评论 -
Hashdict
Hashdicttypedef struct dictEntry{ void* key; union { void* val; uint64_t u64; int64_t s64; }v; struct dictEntry* next;}dictEntry;typedef struct dictht { dictEntry** table; unsigned long size; unsigned long sizemask; unsigned long used;原创 2021-09-29 19:08:22 · 328 阅读 · 0 评论 -
写时拷贝小结
要想深刻了解写时拷贝,首先得先知道写时拷贝解决了什么问题,所以我们先来谈谈浅拷贝和深拷贝:浅拷贝就是让当前的指针指向一块已存在的内存区域,和其它指针共享同一块地址空间。浅拷贝带来的问题是当程序结束时,对象d1和d2都会去调用析构函数去清空这块空间,而一块空间析构两次就会导致程序奔溃。而深拷贝可以在每一次拷贝时为当前指针重新分配空间,不用再去共享那块空间。虽说深拷贝可以很好的解决这个问题,但它也存在自身的问题。比如相同的数据内容如果每次都重新分配空间去放置数据的话,就会造成空间的浪费。为了克服能同时解决这原创 2021-11-19 23:25:24 · 1340 阅读 · 0 评论 -
C++之函数模板
函数模板原创 2021-11-28 20:51:22 · 6878 阅读 · 0 评论 -
C++函数重载补充知识点
1.什么是函数重载?简单来说就是函数名相同,参数列表不同的函数。2.为什么C++有函数重载,而C语言没有函数重载?不论是C++还是C语言,在函数编译时期函数都会生成对应的函数符号,之后编译器才会根据符号的不同来选择调用哪一个函数。在C语言中,函数符号是根据函数名来判定的,也是唯一的判定依据;而在C++中,函数符号是根据函数名和参数列表来判定的,有两个判定依据,即参数列表不同,即使函数名相同,在编译器看来,也不是同一个函数。3.函数重载有什么作用?函数重载的主要好处就是可以根据实参参数类型和参数个数原创 2021-11-13 20:07:04 · 668 阅读 · 0 评论 -
C++基础知识二
1、面向对象三大特性:封装 继承 多态四大特性:抽象 封装 继承 多态2、编程语言主要目的----模拟现实3、面向对象:属性和行为4、this指针:指向本对象的指针,在编译时期加上的。5、自动加this指针的三种情况:普通成员方法的第一个参数,默认加上this指针void work(/* Person *this */)//每一个成员方法在传参的时候都会默认传一个this指针 { //this = NULL; cout << _name << ":work"原创 2021-10-15 17:58:07 · 184 阅读 · 0 评论 -
C++基础知识一
1、在函数声明或者定义的时候,给定参数的默认值,如果实参传递时,不给该形参传值,则会按照默认值传参。int fun(int a, int b, int c = 10){ cout << a << endl; cout << b << endl; cout << c << endl; return 0;}fun(a1,b1);2、函数参数的默认值在编译期生成指令的时候,直接生成入参指令。3、函数参数的默认值只能传递常原创 2021-10-15 15:52:20 · 266 阅读 · 0 评论 -
智能指针(五weak_ptr)
弱智能指针与强智能指针的区别:weak_ptr也是一个引用计数型的智能指针,但是它不会增加对象的引用计数,即弱引用,而shared_ptr是一个强引用,会增加对象的引用计数,只要有一个指向独享的shared_ptr存在,该对象就不会析构,直到最后一个shared_ptr析构时才会被销毁。弱智能指针解决了什么问题:对于shared_ptr来说,它在设计交叉使用时会遇到一个很棘手的问题,如下:class B;class A{public: A() { cout << "A()"原创 2022-01-13 14:12:42 · 569 阅读 · 0 评论 -
智能指针(四shared_ptr)
shared_ptrshared_ptr特点:不能隐式构造不能将同一个裸指针赋值给多个智能指针允许并且可以进行拷贝构造和等号运算符重载每个shared_ptr对象在内部指向两个内存位置:指向对象的指针;用于控制引用计数的指针共享所有权如何使用引用计数:当新的shared_ptr对象与指针相关联时,则在其构造函数汇总,将与此指针相关量的引用计数加1.当任何shared_ptr对象超出作用域时,则在其析构函数中,它将关联指针的引用计数减1如果引用计数减为0,则表示没有shared_ptr原创 2022-01-13 14:12:25 · 655 阅读 · 0 评论 -
智能指针(三unique_ptr)
unique_ptr智能指针为什么说unique_ptr是一个独享指针,体现在哪里?unique_ptr对象始终是关联的原始指针的唯一所有者,因此在其析构函数中它直接删除关联的指针,不需要任何参考计数。我们无法复制unique_ptr对象,它只能移动。unique_ptr的特点:不允许隐式构造不能将同一个裸指针赋值给多个智能指针不允许普通的拷贝构造和等号运算符重载(auto_ptr允许这种操作,是直接将原智能指针给置空了,而这里则直接不允许这种操作)允许对即将死亡的对象做拷贝构造和等号运算符原创 2022-01-13 14:12:10 · 1688 阅读 · 0 评论 -
智能指针(二auto_ptr)
C++之智能指针(二)auto_ptr指针auto_ptr指针通过模拟实现auto_ptr的功能来认识auto_ptr智能指针auto_ptr的特点:不允许隐式构造不能将同一个裸指针赋值给多个智能指针允许普通的拷贝构造和等号运算符重载允许对即将死亡的对象做拷贝构造和等号运算符重载 消除资源直接使用deletetemplate<typename T>class Mauto_ptr{public: //不允许隐式构造 explicit Mauto_ptr(T* ptr原创 2022-01-13 14:11:45 · 1141 阅读 · 1 评论 -
智能指针(一介绍)
智能指针原创 2022-01-13 14:11:16 · 284 阅读 · 0 评论 -
单例模式介绍
目录引入单例模式概念单例模式的设计类型饿汉式创建对象懒汉式创建对象懒汉式的线程安全懒汉式单例模式所造成的内存问题引入设想一下,你现在正在使用编译器写代码,此时你点工具箱,它会显示出来一个功能界面,你再点一下,他就会关闭,不会再显示出另一个界面。如图:它永远不会是这样:不论你点多少次,它只会显示一次。这其实就是一个单例模式。单例模式概念单例模式是指一个类有且仅有一个实例,并提供一个可以访问它的全局访问点,即:在内存中仅会创建一次对象。就像上.原创 2022-05-02 18:18:24 · 631 阅读 · 2 评论 -
银行转账带来的死锁问题
如果只是单纯的进行两个账户之间的转账,那么久很容易导致死锁问题std::mutex mxA;std::mutex mxB;int countA = 1000;int countB = 1000;void thread_fun1(int money){ std::unique_lock<std::mutex>lcA(mxA); cout << "线程1获得了A账户的锁" << endl; if (countA > money) { cout原创 2022-03-24 21:51:52 · 339 阅读 · 0 评论 -
多线程编程
int funa(int n, int& x){ for (int i = 0; i <= n; i ++ ) { cout << "thread funa" << endl; std::this_thread::sleep_for(std::chrono::microseconds(100)); } x = n; cout << "thread funa_end()" << endl; return n;}...原创 2022-03-23 20:41:50 · 474 阅读 · 0 评论 -
生产者和消费者
不能精准的唤醒,必须通过while循环控制不可改变为if语句原创 2022-03-23 20:06:05 · 382 阅读 · 0 评论 -
二叉树详解
树的介绍树的定义树是由n(n>=0)个节点组成的有限集合。如果n=0,称为空树;如果n>0,则:有一个特定的称之为根(root)的节点,它只有直接后继,但没有直接前驱;除根以外的其它节点划分为m(m>=0)个互不相交的有限集合,每个集合又是一棵树,并且称之为根的子树,没棵子树的根节点有且只有一个直接前驱,但可以有0个或多个直接后继树的性质:节点的度:一个节点含有的子树的个数称为该节点的度; 树的度:一棵树中,最大的节点的度称为树的度(这里不一定是根节点,如原创 2022-03-20 19:45:24 · 4993 阅读 · 1 评论 -
线程安全-栈
当入栈获得锁时,必须从用户态转移到内核态,锁住互斥锁,再到达用户态继续向下运行。在入栈时,出栈函数由于获取不到锁,就会阻塞,直到入栈函数执行完释放锁之后才能在内核态获得锁,再转移到用户态继续执行。同步:同步的意思是函数执行有顺序,A执行完之后才能执行B,B执行完之后才能执行C,以此类推。而不是简单的理解为同步就是同时执行异步:异步指的是在同一时间内,A B C函数可能同时执行,没有固定的顺序,互相不影响。完整代码://栈空异常类型,主要为栈空做准备struct empty_stack :std:.原创 2022-02-27 22:55:41 · 768 阅读 · 0 评论 -
CAS原子操作
void pop() { std::lock_guard<std::mutex>lock(mtx); if (base != NULL) { StackNode* q = base; base = q->next; &(q->data)->~T(); Freenode(q); cursize -= 1; } }改为原子操作:完整代码:#include<iostream>#include&l..原创 2022-02-27 22:52:45 · 302 阅读 · 0 评论 -
算法-求具有最大和的连续子序列
dp[i]相当于前i-1家总和原创 2022-02-27 21:16:37 · 286 阅读 · 0 评论 -
智能指针weak_ptr(二)-循环引用问题
template<class _Ty>class RefCnt{public: _Ty* _Ptr;//指向Obj std::atomic_int _User;//对应shared_ptr std::atomic_int _Weaks;//对应weak_ptrpublic: RefCnt(_Ty*p):mptr(p),_User(1),_Weaks(1){} ~RefCnt(){} void _Incref() { _User += 1; } void _Incwr原创 2022-02-25 13:01:19 · 501 阅读 · 0 评论 -
智能指针weak_ptr(一)
直接上代码//单个删除器template<class _Ty>class MyDeletor{public: MyDeletor() {} void operator()(_Ty* ptr)const { if (ptr != NULL) { delete ptr; } }};//数组删除器template<class _Ty>class MyDeletor<_Ty[]>{public: MyDeletor() = def原创 2022-02-25 13:00:51 · 356 阅读 · 0 评论 -
动态规划-最长公共子序列
寻求两个字符串的最长公共子序列假设:A={X1,X2,X3,X4,X5,X6…Xm};B={Y1,Y2,Y3,Y4,Y5…Yn};算法思想:如果Xm=Yn,那么最长公共子序列的最后一个元素一定就是Xm/Yn如果Xm!=Yn&&Xm!=Zkc[m][n]=(m==0||n==0)?0m>1,n>1c[m][n]=(xm==yn)?c[m-1][n-1]+1c[m][n]=(Xm!=Yn)?Max(c[m-1][n],c[m][n-1])...原创 2022-02-25 00:18:19 · 379 阅读 · 0 评论 -
C++平面中的最接近点对
快速排序中的问题如果是有序的,该怎么解决?随机化法,三位取中法如果要找到第k小的或第k大的?原创 2022-02-25 00:17:22 · 696 阅读 · 0 评论 -
归并排序-
递归实现非递归实现原创 2022-02-25 00:15:58 · 53 阅读 · 0 评论 -
C++算法—分治策略
分治策略与递归递归每一次递归都会分配空间,时间复杂度为:O(n) 空间复杂度为:S(n) 递归的时候,先过滤参数,再写执行语句举例:1 阶乘循环改递归:使用引用的结果:2//递归int FindPos(const int* br, int n, int val){ if (n <= 0 || br[n] == val) { return n - 1; } else { FindPos(br, n - 1, val); }}//非递归int原创 2022-02-25 00:14:40 · 109 阅读 · 0 评论 -
寻找第k小的值-划分递归实现
int FindK(int* br, int left, int right, int k){ if (left == right && k == 1)return br[left]; int pos = Parition(br, left, right); //pos+1就是第pos+1小的数据,当k<pos+1时,就在左半部分寻找,当k>pos+1-left时,就说明需要在右半部分寻找第k-(pos+1-left)小的数据,也就是整个数组的第k小 int j = p原创 2022-02-25 00:13:36 · 161 阅读 · 0 评论 -
快速排序-单向划分
void swap(int *a, int *b){ int tmp = *a; *a = *b; *b = tmp;}int LeftParition(int* br, int left, int right){ int i = left - 1, j = left; int tmp = br[j]; while (j <= right) { if (br[j] <= tmp) { ++i; swap(&br[j], &br[i]);原创 2022-02-25 00:11:59 · 295 阅读 · 0 评论 -
八大排序之快速排序-双向划分
递归实现:int Parition(int* br, int left, int right){ int tmp = br[left]; while (left < right) { while (left<right && br[right]>tmp) { --right; } if (left < right)br[left] = br[right]; while (left < right && br[l原创 2022-02-25 00:09:04 · 289 阅读 · 0 评论 -
C++模拟面试题
模拟面试题谈谈结构体对齐的规则如何求救偏移量?结构体为什么要对齐?请详细说明堆和栈的区别?请实现大端和小端的互相转变打印杨辉三角(使用一维数组)实现,快排,堆排,归并排序的代码谈谈结构体对齐的规则1、结构体变量的首地址,必须是结构体变量中最大基本数据类型成员所占字节数的整数倍。2、结构体变量中的每个成员相对于结构体首地址的偏移量,都是该成员基本类型所占字节的整数倍。3、结构体变量的总大小,为结构体变量中最大基本数据类型成员所占字节数的整数倍。如何求救偏移量?链接: https://blog.cs原创 2022-01-28 19:13:20 · 801 阅读 · 1 评论 -
C++引用与const的结合用法
引用与const的结合用法引用的基本概念:(1)引用其实就是给变量其一个别名(2)其语法形式:变量类型 &别名=原名 例:int &b=a(3)引用必须进行初始化,int&b是不对的(4)引用一旦初始化之后就不可更改了(5)引用的传递:传递有值传递和地址传递。引用传递就是地址传递,通过引用参数产生的效果同按照地址传递是一样的(6)不要反悔局部变量的引用。函数的调用可以作为左值(如果函数的返回值是引用,这个函数调用可以作为左值)(7)引用的本质:在C++内部实现是一个指原创 2022-01-11 15:07:44 · 1992 阅读 · 0 评论