c++
土土土~
黄梅时节家家雨,青草池塘处处WA
展开
-
c++ 单列模式的写法
第一种 懒汉式,多线程操作会出问题,而且值负责new对象,没有删除class Singleton{private: Singleton(){} Singleton(const Singleton & s)=delete; Singleton & operator = (const Singleton &s)=delete; static Singleton* _instance;public: Singleton* get_inst.转载 2021-03-20 13:30:54 · 138 阅读 · 0 评论 -
C++ static_cast、dynamic_cast
static_cast:类似于c++里面的强制类型转换,在编译器就完成,转型错误会报错原有的自动类型转换,例如 short 转 int、int 转 double、const 转非 const、向上转型等;void 指针和具体类型指针之间的转换,例如void *转int *、char *转void *等;有转换构造函数或者类型转换函数的类与其它类型之间的转换,例如 double 转 Complex(调用转换构造函数)、Complex 转 double(调用类型转换函数)。不能把const转成非co原创 2021-03-03 20:37:29 · 85 阅读 · 1 评论 -
c++ 关于#define和typedef
#define是宏定义 直接替换,可以理解为字符串的替换typedef是对类型的一种封装举个栗子 char* a,b; cout<<sizeof(a)<<" "<<sizeof(b);其结果可知,a是指针类型,b是char类型 (指针一律 4|8 个字节 )还可以得知int* a int * aint *a三者是等同的 都等于int *a那么当我们使用typedef的时候(以下两种写法一样)typedef int *pint;ty原创 2021-01-04 22:32:50 · 92 阅读 · 0 评论 -
c++ STL set
set可理解为一个集合,因此set的插入的值是不能重复的set的底层是一颗红黑树,因此set的插入查找效率比较高,set的底层会对元素进行排序set自定义排序的方式重载 < 运算符号struct student{ int id; string name; student(int ID=0,string s=""):id(ID),name(s){} bool operator < (const student &s)const{ re原创 2021-01-04 12:24:38 · 69 阅读 · 0 评论 -
剑指offer-65 不用加减乘除符号实现加法运算
两个数相加 在二进制中 只有1+1需要进位,进位之后这个位置结果为0,下一位的结果要加上1异或 运算是进行的是 不进位加法,但是所进的位该怎么表示因为只有1+1才能进位,而只有 1&1 的结果为1 ,用 与 运算符得到两个数的结果,1表示在这个位置要进位,0则不进,而进位要加在下一位上面,所以 a&b 的结果要左移一位这样a+b的结果就可以表示为 a^b + (a&b)<<1当b=0的时候,结果就是a 因此我们找到了递归条件计算机减法也是用补码进行加法来计算的转载 2020-12-26 16:41:23 · 76 阅读 · 0 评论 -
c++ list
list是一个双向循环链表链表在每一次插入的时候,申请一块新的内存保存数据 删除的时候会释放这块内存,因此,相比较于deque来说,list不会造成内存的浪费但是链表内存消耗相对来说也是比较的大 因为每一个节点都保存了下一个节点和上一个节点的地址 众所周知,一个指针在32位操作系统中要占用4个字节(64位8字节)list不支持随机访问,vector和deque可以支持随机访问构造函数 list<int>l2; list<int>l3(10,1);原创 2020-12-23 17:09:46 · 79 阅读 · 0 评论 -
c++ stack和queue
stack 栈 先进后出 ,可以理解为一个桶。先进去的都是在桶底,后进去的在桶的顶部queue 队列 先进先出 可以理解为排队,谁先来谁就在前面底层实现:我们可以发现 ,其实stack和queue的底部就是一个deque,所有的操作其实都是在操作这个东西构造函数: ·deque<int>d; stack<int>s1(); 默认的构造函数 stack<int>s2(d); 传入一个deque,把deque的值复制进.原创 2020-12-22 21:58:44 · 109 阅读 · 0 评论 -
c++ STL deque
vector是一个单向的线性数组,只能在尾部进行插入操作deque 可以在头部和尾部都可以进行插入操作,deque采用分块的线性存储结构来存储数据,每一个块都是用map来管理,map中存储的是块的首地址,内存不够的时候去申请新的块内存,每一个块中都像数组一样线性存储大概类似这样:构造函数:deque<int> d(); //默认deque<int> d(5); //默认size为5deque<int> d(5,1) //默认长度为5 默认值为1dequ原创 2020-12-21 17:46:27 · 174 阅读 · 1 评论 -
c++ STL vector
vector是一个动态的数组vector -构造函数vector():创建一个空vector vector<int>v1;//v1.capacity()=0vector(int nSize):创建一个vector,元素个数为nSize vector<int>v2(10);//v2.capacity()==10vector(int nSize,const t& t):创建一个vector,元素个数为nSize,且值均为t vector<int原创 2020-12-21 16:26:29 · 95 阅读 · 0 评论 -
c++重载new delete
当我们new 一个对象的时候,编译器会为我们做一下这些事情1:申请内存2:调用这个对象的构造函数当我们delete一个对象的时候,编译器会为我们做一下这些事情1:调用对象的析构函数2:释放指针指向的内存当我们重载new 和delete 的时候,我们可以改变第一步,(第二步该干啥还是就干啥)c++有默认的new个delete 当编译器找不到对应的重载的时候,会调用默认的new 和 delete重载有分为两种,一种是全局的,那么调用new任何对象都会调用这个函数另一种是局部的,写在类的内部(原创 2020-12-18 21:07:25 · 278 阅读 · 1 评论 -
c++虚析构函数
如果一个类被当做基类,最好吧析构函数协成虚函数,加入一个父类指针指向子类的对象,当delete其对象的时候,之后调用父类的析构函数,不会调用子类的析构函数如下例子所示#include<bits/stdc++.h>using namespace std;class A {public: virtual ~A(){ cout << "a"; }};class B :public A {public: ~B(){原创 2020-12-18 20:10:02 · 185 阅读 · 1 评论 -
c++智能指针
智能指针:指针主要用于管理在堆上分配的内存,而智能将普通的指针封装为一个栈对象。当栈对象的生存周期结束后,会在析构函数中释放掉申请的内存,从而防止内存泄漏智能指针分类:auto_ptr(c++11已经舍弃,一般不用)unique_ptr(保证只有一个指针指向该对象,当另一个指针指向他所指的对象的时候,这个指针的指向会为空)shared_ptr(后面这俩没用过)weak_ptrunique_ptr:#include <iostream>#include<string>原创 2020-12-11 16:51:42 · 66 阅读 · 0 评论 -
c++移动构造和移动赋值
与赋值构造函数和复制构造函数不同,假设有指针的情况,这两个函数都是深拷贝而移动构造和移动赋值是浅拷贝,还会吧之前的指针指为空,防止析构函数执行的时候清空内存移动构造和移动赋值可以节约性能,而且是针对右值引用,#include <iostream>#include <string>#include<cstring>using namespace std;class A{ int x; char* ptr_;public: A(in原创 2020-12-10 22:20:56 · 656 阅读 · 1 评论 -
c++ 我对-复制构造函数和赋值构造函数的理解
复制构造函数,是当一个类被另一个类初始化的时候,调用的是复制构造函数而赋值构造函数,是在一个已经初始化过的类再一次被赋值的时候,会调用赋值构造函数#include <iostream>#include<cstring>#include<cstdio>using namespace std;class Test{public: int a; char *str;public: Test(int a,char *str){原创 2020-11-16 19:33:41 · 123 阅读 · 1 评论