C++
文章平均质量分 66
sp_13230409636
这个作者很懒,什么都没留下…
展开
-
358-C++、Linux必备知识点
111原创 2022-05-30 15:41:52 · 283 阅读 · 2 评论 -
357-C++、Linux必备知识点
1.int a=4,则对于表达式++(a++)的结果为?答案:不是5!编译不通过,a++的结果为4,++4是不正确的,4是右值,如果改成++(b = a++);结果就是5了2.若变量a是int类型,并执行了语句a=’A’+1.6;则正确的结果是?a的值是字符’A’的ASCⅡ值加上13.decltype和auto都可以用来推断类型,但是二者有几处明显的差异1.auto忽略顶层const,decltype保留顶层const2.对引用操作,auto推断出原有类型,decltype推断出引用3.对解引原创 2022-05-19 16:48:58 · 713 阅读 · 0 评论 -
318-C++ vector中函数用法介绍
1.构造函数①vector vec;//无参数,构造一个空的vector②vector( size_type num, const TYPE &val ); //数量(num)和值(val) - 构造一个初始放入num个值为val的元素的vector③vector( const vector &from ); //构造一个与 from 相同的vector④vector( input_iterator start, input_iterator end ); //迭代器原创 2022-04-08 18:02:20 · 1453 阅读 · 0 评论 -
291-C++ map和无序map的区别
1.map优点:有序性,这是map的最大的优点,其元素的有序性在很多应用中都会简化很多的操作,map的底层实现是红黑树,使得map的很多操作可以在logn的时间内就可以实现,效率非常的高缺点: 空间占用率低,因为map的底层是红黑树,虽然提高了运行效率,但是因为每一个节点都需要额外保存父节点、左右孩子节点和红/黑性质,使得每一个节点都占用大量的空间适用处:对于那些有顺序要求的问题,用map会更高效一些2.unordered_map优点: 因为无序map的底层是哈希表,因此它的查找速度非常的快缺点原创 2022-04-04 14:54:06 · 2200 阅读 · 0 评论 -
289-C++ bind绑定
1.需要引入头文件#include 下面程序fr1绑定的是fun函数,fun函数没有参数,所以fr1()直接调用即可,因为function的参数是void,所以不需要指定参数fr2绑定func函数,在绑定的时候给了一个参数值为12,这个参数必须要给,否则bind编译不通过,在调用的时候fr2();不能给参数,因为function的参数类型是void类型,如果给参数,不能编译通过fr3绑定func函数,在绑定的时候给了一个参数值为12,这个参数必须要给,否则bind编译不通过,调用的时候也必须要给一个参原创 2022-04-03 21:53:16 · 1214 阅读 · 0 评论 -
288-Linux 线程同步
Linux/C++线程同步的四种方式:信号量,条件变量,互斥锁,读写锁背景问题:在特定的应用场景下,多线程不进行同步会造成什么问题?通过多线程模拟多窗口售票为例:#include <iostream>#include<pthread.h>#include<stdio.h>#include<stdlib.h>#include<string.h>#include<unistd.h>using namespace std;原创 2022-04-01 15:16:36 · 1002 阅读 · 0 评论 -
286-C++ 线程池
1.半同步半异步线程池上面部分是同步的,下面部分是异步的,所以是半同步半异步,同步队列添加任务时是互斥的,即我添加任务的时候你不能添加,你添加任务的时候我不能添加,要用到互斥量异步服务调用不同的线程来处理任务,每个线程之间是独立的,线程之间没有任何的关系2.数据密集型应用是什么?3.线程池和进程池的区别4.有两个条件变量的原因是,一个条件变量用于当同步队列达到上限时,等待任务减少,当处理了一个任务的时候,就会通知同步服务可以继续添加任务,还有一个条件变量是当同步队列为空时,等待任务到达,原创 2022-03-31 20:36:28 · 910 阅读 · 0 评论 -
285-C++ 设计一个通用栈
class GenericStack{private: struct StackNode { void* data; StackNode* next; public: StackNode(void* newdata, StackNode* nextNode) :data(newdata), next(nextNode) {} }; StackNode* _top; int _size; GenericStack(const GenericStack&) = d原创 2022-03-31 19:41:37 · 538 阅读 · 0 评论 -
284-C++对象池
1.对象池是通过模板来实现的2.对象池是一个链表template<class _Ty>class ObjectPool{ enum {nPoolSize = 4};protected: struct _Node { _Node* next; }; _Node* front; _Node* rear;private: void ReFillPool() { size_t total = sizeof(_Node) + sizeof(_Ty);//_Node节点的原创 2022-03-30 18:02:07 · 1033 阅读 · 0 评论 -
283-C++ pv操作
1.wait()会使线程阻塞住,放到阻塞队列中,当执行notify_all的时候,回将阻塞队列中所有的线程置于CPU的阻塞态,然后这些线程争夺互斥量,哪个线程获得了互斥量,就从阻塞态转为就绪态,获得CPU的调度和执行,转为执行态如果是nitify_one只会将其中的一个线程从阻塞队列中置于CPU的阻塞态,然后获得互斥量,从阻塞态转为就绪态,获得CPU的调度和执行,转为执行态wait()会将资源释放掉2.线程分配的栈空间的大小是1M,线程分配的栈空间是内核分配来的3.信号量有二元信号量,只有1和04原创 2022-03-30 17:25:12 · 1273 阅读 · 0 评论 -
282-C++ B树
1.B树的定义B树就是B-树2.B树的一些特点3.B树的性质4.原创 2022-03-30 14:16:42 · 1488 阅读 · 0 评论 -
281-C++ T树
1.T树也叫键树,键树也叫数字查找树(Digital Search Trees),也叫字典树下图就是一个T树2.T树中有两种节点,一个是分支节点,一个是元素节点,如果指向的是分支节点,继续比较,如果指向的是元素节点,直接比较T树只能插入不能删除,删除很麻烦3.每个分支节点的下标从1开始都是在0下标的基础上加了一个A~Z的字母,比如说0下标是CHA,那么1下标就是CHAA,2下标就是CHAB…以此类推0下标一定是元素节点而不是分支节点4.T树不允许插入重复元素5.T树为什么不能删除元素?因原创 2022-03-29 13:09:49 · 207 阅读 · 0 评论 -
280-C++互斥锁 条件变量
1.如果g_num是原子的,就是说线程a++g_num的时候线程b不能++,线程b++g_num的时候,线程a不能++,所以最后的结果总是为11,而如果g_num不是原子的,那最后的结果有可能是11也有可能不是11在定义g_num的时候就算加上volatile易变关键字也依然是不正确的2.互斥量的头文件是#include ...原创 2022-03-28 20:46:49 · 1023 阅读 · 0 评论 -
279-C++ 线程thread
1.线程函数2.线程不可以调用缺省的构造函数和赋值函数,但是可以调用缺省的移动构造函数和移动赋值函数,它把缺省的构造函数和赋值函数删了3.此时,程序运行会导致程序崩溃,崩溃的原因是:由于主线程结束了,而其他线程还没有结束,就会导致程序崩溃线程中有join函数,函数的作用是等待线程结束后,才继续运行后面的程序注意:先创建出来的线程并不一定先执行完...原创 2022-03-24 16:19:24 · 424 阅读 · 0 评论 -
268-C++ 红黑树RBTree
最下面的黑色节点是哨兵节点通常面试的时候都不给出头节点,有头节点会使红黑树变的更加容易红黑树能不能给出三种颜色?就相当于是AVL树,AVL树是三种状态RB树只要求是大致平衡的,不想AVL树是完全平衡的下面两个图是等价的,所有路径都包含相同数目的黑色节点每次新建节点的默认颜色都是红色typedef enum {RED = 0,BLACK = 1}ColorType;typedef int KeyType;typedef struct rb_node{ rb_node* lef.原创 2022-03-20 11:51:29 · 969 阅读 · 0 评论 -
267-C++ AVL树
1.AVL树和红黑树都是二叉搜索树2.AVL树的定义左单旋完整代码//左单旋void RotateLeft(AVLTree& tree, AVLNode* ptr){ AVLNode* newroot = ptr->rightchild;//新根 newroot->parent = ptr->parent; ptr->rightchild = newroot->leftchild;//1 if (newroot-&原创 2022-03-19 16:40:40 · 953 阅读 · 0 评论 -
266-C++ 二叉树
1.判断是否为完全二叉树的方法,先将根节点(A)入队,队列不为空,将A出队,将A的左右孩子(BC)入队,队列不为空,将A的左孩子(B)出队,将A的左孩子的左右孩子(DE)入队,队列不为空,将A的右孩子©出队,将A的右孩子的左右孩子(FG)入队,队列不为空,将A的左孩子的左孩子(D)出队,将A的左孩子的左孩子的左右孩子(H空)入队,队列不为空,将A的左孩子的右孩子(E)出队,将A的左孩子的右孩子的左右孩子(空I)入队,队列不为空,将A的右孩子的左孩子(F)出队,将A的右孩子的左孩子的左右孩子(空空)入队,队列原创 2022-03-19 12:36:51 · 614 阅读 · 0 评论 -
265-C++ 二叉树代码
typedef char ElemType;typedef struct BtNode//BinaryTreeNode{ ElemType data; struct BtNode* leftchild; struct BtNode* rightchild;}BtNode,*BinaryTree;struct StkNode{ BtNode* pnode; int pos;public: StkNode(BtNode* p) :pnode(p), p原创 2022-03-18 19:33:15 · 511 阅读 · 0 评论 -
264-C++ 二叉树
1.树的定义二叉树是最简单的树形结构如果一个节点的左孩子是一个棵满二叉树,它的右孩子也是一棵满二叉树,那么这棵树是否一定是一个满二叉树?答案:不一定这种情况就不是一颗满二叉树如果一个节点的左孩子是一个棵完全二叉树,它的右孩子也是一棵完全二叉树,那么这棵树是否一定是一个完全二叉树呢?答案:不一定如果是满二叉树,可以用顺序表存储,如果是普通二叉树,使用顺序表浪费的空间很多,所以一般不使用顺序表存储普通二叉树三叉链表的存储密度要比二叉链表的存储密度要小原因是三叉链表要有三原创 2022-03-18 15:24:26 · 497 阅读 · 0 评论 -
262-C++ C11标准
1.C++中的类型转换分为四种形式:C语言中的转换都是没有意义的,就是说C语言中的强转都是(int) (int*)这样的类型,你不知道它这么转的意义是什么,意义不够明确,所以C++中给出了4种类型转换①static_cast:值的转换,相当于C语言中的强转,这个转换意义很明确就是将float类型转成整型int a = 10;float ft = 12.23;a = static_cast<int>(ft);//转成intft = static_cast<float>(a)原创 2022-03-17 20:21:51 · 1056 阅读 · 0 评论 -
261-判断是裸指针还是智能指针
class Object{private: int value;public: Object(int x = 0) :value(x) { cout << "create Object" << this << endl; }};template<class T>struct my_class{ static const bool value = true;};template<class T>struct my_c原创 2022-03-17 11:23:12 · 238 阅读 · 0 评论 -
260-volatile易变关键字
1.C/C++ 中的 volatile 关键字和 const 对应,用来修饰变量volatile 关键字是一种类型修饰符,用它声明的类型变量表示可以被某些编译器未知的因素更改,比如:操作系统、硬件或者其它线程等。遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化,从而可以提供对特殊地址的稳定访问。声明时语法:int volatile vInt; 当要求使用 volatile 声明的变量的值的时候,系统总是重新从它所在的内存读取数据,即使它前面的指令刚刚从该处读取过数据,而且读取的数据立刻被保原创 2022-03-16 21:16:33 · 221 阅读 · 0 评论 -
259-C++ STL SGI标准的空间配置器alloc
1.volatile关键字2.一开始是,链表都为空,当链表为空时,要进行填充3.内存池只能解决外部碎片,但是不能解决内部碎片,假如我需要申请20字节的空间,那么只能将24块的内存分配给我,其中20字节供我使用,剩下的4字节就浪费了,就是块内碎片,剩下的4个字节是不会链接到其他区域的链表上的,因为最小内存块的大小是8字节内存碎片是无法克服的问题,理论上外部碎片和内碎片是无法同时解决的4.在自由链中的这些内存块还是属于池子,而不属于用户,所以可以池子可以自行调整5.我们希望一下子可以填充20个块,如果原创 2022-03-16 15:33:50 · 659 阅读 · 0 评论 -
258-C++ STL SGI标准的空间配置器alloc
1.POD类型是只包含数据的结构体类型,没有方法,把它看作是一个数据集合时,就是POD类型2.对于内置类型来说,没有拷贝构造函数和析构函数3.#include <stl_alloc.h>负责空间的申请和释放#include <stl_construct.h>负责对象的构建和析构#include <std_uninitialized.h>负责处理大块内存的填充和拷贝4.STL把建立对象和析构对象分成一组,申请空间和释放空间分成一组5.对象建立前的空间配置,和对象原创 2022-03-15 23:08:11 · 581 阅读 · 0 评论 -
257-C++迭代器
1.内存空间配置器,一级配置器、二级配置器2.STL源码剖析3.迭代器相应型别:①value type:值类型迭代器要知道迭代数据的类型是什么②difference type:差值类型可以计算两个迭代器的差值,即两个迭代器之间有多少个元素③reference type:引用类型允许改变所指之物的数据,即普通迭代器(可变迭代器mutable iterator,返回的是一个左值),不允许改变所指之物的数据,即常性迭代器(constant iterator)④pointer type:指针类型原创 2022-03-15 19:13:34 · 1425 阅读 · 1 评论 -
256-C++ lambda表达式
1.下面程序能否编译通过?全局变量g_max不存在捕获概念,对于全局变量和全局对象来说,不存在捕获这个概念,对于x1来说,它不捕获任何变量,所以不能使用a,error,对于x2来说,它是按值捕获,会产生一个副本,它能捕获的有a,b和this指针,this指针本身是一个常性指针Object * const this,所以无论按值还是引用捕获过来还是常性的,不能this = nullptr2.如果只是捕获当前类中的this指针,那么lambda表达式就拥有了和当前类成员函数一样的访问权限,即可以访问成员变原创 2022-03-15 11:13:32 · 376 阅读 · 0 评论 -
255-C++ 动态规划 01背包问题
1.递归写法//递归方法int Knapsack(vector<int> w, vector<int> v, int i, int j, int n){ if (i == n) //只有一个物品 { return j >= w[i] ? v[i] : 0; } else { if (j < w[i]) //不装 return Knapsack(w, v, i + 1, j, n); else //装 { int maxv1 =原创 2022-03-14 21:02:32 · 1170 阅读 · 0 评论 -
254-C++ STL map lambda表达式
1.lambda表达式2.map的底层实现是红黑树3.map类型4.map中的[]和at是很重要的5.map有唯一性map和多重map6.T树,也叫做键值树,也叫做字典树7.map和无序map中的迭代器是一种双向迭代器,map中的迭代器不是随机迭代器,不能对it+=5;只能++it或者–it8.统计字符串中字符出现的次数map的建立:首先从数组中得到一个一个的字符串,先得到"map",把map交给x,它首先会在整个树形结构中查看存不存在"map"这个节点,如果不存在,将会构建value原创 2022-03-14 17:26:11 · 1688 阅读 · 0 评论 -
253-C++ STL deque 双端队列
1.双端队列双端队列就是两端都可以进行入队和出队,既可以在头部插入和删除数据,也可以在尾部插入和删除数据2.双端队列中在面试中问的比较多面试会问:双端队列是如何设计的?3.双端队列在内存中是如何布局的?有两个迭代器start和finish,每个迭代器中都有cur指针指向下一次插入数据的位置,first指针指向缓冲块的第一个元素(不管有没有数据都是指向第一个位置),last指针指向缓冲块的最后一个元素(不管有没有数据都是指向最后一个位置),node指针指向当前缓冲块节点,start迭代器指向所有缓原创 2022-03-13 19:25:58 · 655 阅读 · 0 评论 -
252-C++ STL list
1.list的介绍和使用2.vector中的reserve只对空间进行扩大,而不构造对象,resize将空间扩大,而且还会构造对象所以reserve扩大的空间并不能使用像vec[0] = 10这样的赋值操作,因为厘米没有对象,只有空间,而resize是可以的,因为resize在扩容的时候还创建了对象,reserve的last指针指向的是第一个元素的前面,而resize中的last指针指向的最后元素的后面,3.(面试常问)vector中的push_back(100)和push_back(Object(原创 2022-03-13 18:38:42 · 1038 阅读 · 0 评论 -
251-C++ 动态规划
1.动态规划的四个解题步骤:①定义子问题②写出子问题的递推关系③确定DP数组的计算顺序④设置初始值⑤空间优化2.注意:动态规划每个节点它代表的不是一个点值,而是一个区域值3.解决动态规划问题的核心就是缩小问题规模,找到递推关系式4.打家劫舍问题动归方程式:n>2时,dp[k] = Max{dp[k-1],dp[k-2]+nums[k]};这样可以缩小规模,终止条件是,当n=1时,dp[1] = nums[1],当n=2时,dp[2] = Max{nums[1],nums[2]}i原创 2022-03-13 14:28:50 · 415 阅读 · 0 评论 -
250-C++ STL vector
1.vector简介2.先构建的是4个无名对象,再将4个无名对象拷贝构造到指定的空间以后,需要析构无名对象,当程序结束时,再析构4个Object对象vector中的first指针和last指针指向第一个元素之前,end指针指向最后一个元素的后面,所以first-last就是vector的容量,也就是capacity,first-last是元素的个数,也就是size3.普通迭代器可以改变元素的值,it->Value()返回的是引用类型,可以修改value的值it->和it就是对象本身,原创 2022-03-12 17:43:56 · 197 阅读 · 0 评论 -
249-C++ 字符串库 string的操作函数
1.String类的构造函数和析构函数如下:a) string s; //生成一个空字符串sb) string s(str) //拷贝构造函数,生成str的复制品c) string s(str,stridx) //将字符串str内“始于位置stridx”的部分当作字符串的初值d) string s(str,stridx,strlen) //将字符串str内“始于stridx且长度顶多strlen”的部分作为字符串的初值e) string s(原创 2022-03-12 10:52:20 · 138 阅读 · 0 评论 -
248-C++ 字符串库 string
1.STL是"Standard Template Library"的缩写,中文译为“标准模板库”,STL是C++标准库的一部分,不用单独安装2.vector的底层为顺序表(数组),list的底层为双向链表,deque的底层为循环队列,set map的底层为红黑树,unordered_map(hash_map)的底层为哈希表3.vector和deque中的迭代器称为随机迭代器,list、set和map中的迭代器称为双端迭代器,每次只能走一步,不能走多步vector中的迭代器是随机迭代器,list中的迭原创 2022-03-12 10:32:11 · 233 阅读 · 0 评论 -
247-C++菱形继承
1.C++有4个子集,有C子集、class子集、STL、template2.左值可以取地址当定义void fun(int a);时,程序就不能编译通过了,因为fun(a);既可以调用fun(int a)也可以调用fun(int& a),所以去掉void fun(int a);后,就可以编译通过了,fun(a)中a是一个左值,调用的是左值引用,fun(b)中b是一个常量,调用的是常引用,fun(10)中10是一个纯右值,调用的是右值引用如果把void fun(int&& a)去掉原创 2022-03-12 09:12:27 · 141 阅读 · 0 评论 -
229-C++斐波那契数列递归非递归写法
1.有一对兔子,从出生第3个月起每个月都生一对兔子,小兔子长到第3个月后每个月又生一对兔子,假如兔子都不死,问第24个月的兔子总数有多少对?面试中经常问如果解决斐波那契数列中重复计算的问题?答案:使用单个变量①非递归写法(数组方式)int fun(int n){ if (n <= 2) return 1; int* ar = new int[n + 1]; //下标0不用,从下标1开始 ar[1] = 1; ar[2] = 1; for (int i = 3; i <= n;原创 2022-03-05 10:36:20 · 642 阅读 · 0 评论 -
227-C++动态规划
1.动态规划动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。与分治法不同的是,适合于用动态规划法求解的问题,经分解得到的子问题往往不是互相独立的。若用分治法解这类问题,则分解得到的子问题数目太多,以至于最后解决原问题需要耗费指数时间。然而,不同子问题的数目常常只有多项式量级。在用分治法求解时,有些子问题被重复计算了许多次。如果能够保存已解决的子问题的答案,而在需要时再找出已求得的答案,就可以避免大量重复计算,从而得到多项式时间算法原创 2022-03-04 17:12:00 · 553 阅读 · 0 评论 -
226-C++shared_ptr和make_shared的优缺点
1.shared_ptr对象创建方法通常我们有两种方法去初始化一个std::shared_ptr①通过它自己的构造函数②通过std::make_shared2.这两种方法都有哪些不同的特性呢?shared_ptr是非侵入式的,即计数器的值并不存储在shared_ptr内,它其实是存在在其他地方——在堆上的,当一个shared_ptr由一块内存的原生指针创建的时候(原生内存:代指这个时候还没有其他shared_ptr指向这块内存),这个计数器也就随之产生,这个计数器结构的内存会一直存在——直到所有的原创 2022-03-04 12:19:28 · 1419 阅读 · 0 评论 -
225-C++抽象工厂
1.UML图2.如果类型里面有虚函数,就把析构函数定义成虚函数,如果类型里面没有虚函数,也就是这个类不参与到继承关系中,就没有必要把析构函数定义为虚函数,把析构函数定义成虚函数的目的是可以实现连级释放3.工厂方法class Shape // 接口{public: Shape() { cout << "Shape" << endl; } virtual ~Shape() { cout << "~Shape" << endl; } virtual原创 2022-03-04 11:00:01 · 808 阅读 · 0 评论 -
224-C++区分函数接口的继承和函数实现的继承
1.是设计一个类,而不是定义一个类原创 2022-03-03 16:19:47 · 49 阅读 · 0 评论