c++
最爱你了
这个作者很懒,什么都没留下…
展开
-
类型转换 与move
上课笔记原创 2022-07-08 17:31:10 · 103 阅读 · 0 评论 -
依赖,组合,关联,聚合
对象与对象之间的关系依赖关系(使用一个)可能会用到另一个对象主要体现在的是一种使用关系,当一个对象负责构造另一个对象的实例,或当一个对象依赖于另一个对象所提供的服务时,是依赖关系。关联关系(使用一个)是依赖关系的一个特例弱关联比如一个对象里面有另一个对象的指针对象,但是你创建对象的时候给不给他都可以,意思就是说一个对象死了,另一个对象还活着强关联一个对象有另一个对象的引用。你在构建对象的时候一定要初始化。聚合关系(有一个)圆和点,点是圆的一部分,但是点和圆都可以单独存在,一方死亡,另原创 2022-05-23 14:32:06 · 106 阅读 · 0 评论 -
条件变量
条件变量P V二元信号量(不是零就是一)binary_semaphore semp=1;binary_semaphore sems=1;semp.acquire();1->0sems.release();0->1;生产者与消费者class MySemaphore//实现P操作和V操作{public: MySemaphore(int val=1):count(1){} void P()//acquire() { std::unique_lock<std::原创 2022-05-22 17:41:35 · 105 阅读 · 0 评论 -
B树(插入,删除)
B树B-tree树,一个m阶B数目录结构1.根节点子女数为[2,m],m必须是奇数2.除根结点和叶节点以外的所有分支节点至少右[[m/2],m]个子女3.所有节点都位于同一层。(天生就是平衡树)4.m阶B-tree树的节点结构如下B树的插入父节点大于左边的子节点,小于右边的子节点。能放数据的只有1,2,3,4. 0号位置是哨兵位,先存在这里面然后和后面的比较啊父子都有6个节点,0是存刚插入的数据,确定位置后插入,父节点最多存4个节点,当多余4个节点时候就分裂成三个,两个在左两个在右原创 2022-05-14 20:06:55 · 515 阅读 · 0 评论 -
AVL树 插入
AVL树一颗AVL树或者空树,它具有二叉搜索树的性质,它的左子树和右子树都是AVL树,且左子树和右子树的高度只差绝对值不超过1当插入一个值后,左右子树高度差之不小于1,那么就要做平衡处理。#include<stddef.h>#include<stdio.h>#include<iostream>#include<assert.h>using namespace std;typedef int KeyType;typedef struct AV原创 2022-05-13 11:56:44 · 161 阅读 · 0 评论 -
类型转换 完美转发 auto nullptr与NULL
C11的特性类型转换const int a=10;int* p=const_cast<int*>(a);//去常性转换p=static_cast<int*>(&a);//类型转换,但是不会成功,普通类型转换char* cp=reinterpret_cast<char*>(&a);//指针类型转换Object* op=NULL;Base* bp=NULL;Object obj;Base base;op=dynamic_cast&原创 2022-05-05 20:58:42 · 113 阅读 · 0 评论 -
BST树:二叉排序树,二叉排序树
BST树:二叉排序树,二叉排序树根节点比左边大,比右边小每一个节点都有关键码,都不一样左右子树也是二叉搜索树#include<stdio.h>#include<queue>#include<iostream>using namespace std;typedef int KeyType;typedef struct BstNode{ KeyType key; BstNode* parent; BstNode* leftchild; BstN原创 2022-05-04 21:03:39 · 43 阅读 · 0 评论 -
矩阵连乘(递归与非递归)
矩阵连乘int matrixchain(int i, int j, int p[]){ if (i == j) { return 0; } else { int k = i; int t = matrixchain(i, k, p) + matrixchain(k+1, j, p)+ p[i - 1] * p[k] * p[j]; for (k = i + 1;k < j;++k) { int mt= matrixchain(i, k, p) + matrixc原创 2022-04-24 22:29:45 · 156 阅读 · 0 评论 -
0_1背包(递归与非递归)
0_1背包1.从尾部向头部递归递归int Knapsack(vector<int>& w, vector<int>& v, int i, int j, int n)//0_1背包,递归写{ if (i == n)//一个物品 { return j >= w[i] ? v[i] : 0; } else { if (j < w[i])return Knapsack(w, v, i + 1, j, n); else { i原创 2022-04-24 21:48:35 · 99 阅读 · 0 评论 -
list与vector区别,双端队列
int main(){ vector<Object> objvec; objvec.reserve(100);//开辟100个对象的空间 objvec.push_back(Object(10));//在尾部插入一个对象,先构建对象,再移动构造对象到尾部,再把原来的无名对象析构 objvec.push_back(20);//同上 objvec.emplace_back(30);//直接在尾部构建对象。如果在Object的构造函数之前加上explicit,就不能将20直接转换成Obj原创 2022-04-21 22:40:59 · 53 阅读 · 0 评论 -
动态规划题
动态规划题int rob(vector<int>& nums)//小偷偷家,不能投相邻两家,要最大金额{ int n = nums.size(); if (n <= 0) return 0; vector<int> dp(n, 0); dp[1] = nums[1]; dp[2] = max(nums[1], nums[2]); for (int i = 3;i < n;++i) { dp[i] = max(dp[i - 1], dp[i原创 2022-04-20 23:01:43 · 50 阅读 · 0 评论 -
动态规划(生兔子问题 最长公共子序列)
动态规划(最长公共子序列)int LCSLength(const char* X,const char* Y,int m,int n){ if(m==0||n==0)return 0; else { if(X[m]==Y[n])return LCSLength(X,Y,m-1,n-1)+1; else { int max1=LCSLength(X,Y,m-1,n); int max2=LCSLength(X,Y,m,n-1); return max1>max2?原创 2022-04-17 19:08:44 · 847 阅读 · 0 评论 -
循环引用Child Parent
循环引用class Child;class Parent{public: my_weak_ptr<Child> c;public: Parent() { cout << "Parent" << endl; } ~Parent() { cout << "~Parent" << endl; } void hi()const { cout << "hello parent" << endl; }};clas原创 2022-04-02 20:46:30 · 116 阅读 · 0 评论 -
弱指针my_weak_ptr
弱指针my_weak_ptr弱指针里面只有RefCnt指针,指向一块空间,里面有指向对象的指针,和user记录有几个指针指向这个对象,weak记录有几个指针指向这个RefCnt这块空间#include<iostream>#include<atomic>using namespace std;template<class _Ty>class MyDeletor{public: //MyDeletor() = default; MyDeletor()原创 2022-04-02 20:43:49 · 101 阅读 · 0 评论 -
shared_ptr(共享智能指针)
shared_ptr(共享智能指针)和独立智能指针区别,它的对象可以被多个指针指向先是一个对象里面有ptr和删除器,ptr指向一个对象,对象面有计数器ref,和指向对象的指针。#ifndef MY_SHARED_PTR_H#define MY_SHARED_PTR_H#include<atomic>template<class _Ty>class MyDeletor{public: //MyDeletor() = default; MyDeletor() {}原创 2022-04-02 19:26:40 · 120 阅读 · 0 评论 -
unique_ptr(唯一性智能指针)
unique_ptr(唯一性智能指针)不允许拿一个对象初始化另一个对象删除了拷贝构造,有移动构造。template<class _Ty>class my_unique_ptr{private: _Ty* Ptr; my_unique_ptr(const my_unique_ptr&)=delete; my_unique_ptr& operator=(const my_unique_ptr&)=delet;public: typedef _Ty* po原创 2022-04-02 19:26:00 · 145 阅读 · 0 评论 -
智能指针auto_ptr
裸指针:直接定义的指针当裸指针指向的对象被析构,这个指针就是空悬指针无法判断是个指针是一个空悬指针为什么需要智能指针?用裸指针你不知道你指的是一组对象还是一个对象。auto_ptr(c++17中移除)智能指针不对带有const的对象,因为要修改拷贝构造时候,不知道是都指向,可能会释放两次。template<class _TY>class my_auto_ptr{private: bool _Owns; _TY* _Ptr;public: my_auto_ptr(_.原创 2022-04-02 19:25:09 · 40 阅读 · 0 评论 -
快排(递归的,非递归的)从左往右的,从中间开始的随机的开始方式,链表的快排
#include<iostream>#include<vector>#include<list>#include<stack>#include<queue>using namespace std;// 快排 , 归并 , 堆排 //// 0(nlngn); S(1); // // // // typedef int ElemType;typedef struct ListNode{ ElemType data; str原创 2022-03-31 20:55:09 · 96 阅读 · 0 评论 -
lambda表达式 mutable 仿函数
lambda表达式很像仿函数类似于函数里面的函数里面的变量不能改变,都是加了const的,加了mutable的变量,后面即使加了const也是可以改变的里面的变量是重新拷贝出来的和外面的变量不一样全局变量不需要捕获[] 不捕获变量[=]全部捕获按照值捕获[&]以引用的方式捕获,他的变量是可以改变的,因为以你引用的底层就是指针[=,&a]a是引用捕获,uto x0=[]()->int {return g_max;}函数中this指针可以捕获,但是不可以捕获th原创 2022-03-23 18:13:53 · 171 阅读 · 0 评论