- 博客(19)
- 收藏
- 关注
原创 静态库和动态库
什么是库库是写好的,现有的,成熟的,可以复用的代码。现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常。本质上来说,库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。库有两种:静态库(.a、.lib)和动态库(.so、.dll)。所谓静态、动态是指链接。将一个程序编译成可执行程序的步骤:静态库之所以称为【静态库】,是因为在链接阶段,会将汇编生成的目标文件.o与引用到的库一起链接打包到可执行文件中。因此对应的链接方式称为静态链接。试想一下,静态库
2020-08-13 19:38:24 250
原创 C++11新特性
文章目录auto:lambda表达式:右值引用与移动语义:智能指针:nullptr 代替了NULLtuple元祖 & 花括号初始化override关键标识auto:1)auto声明的变量必须要初始化,否则编译器不能判断变量的类型2)auto不能被声明为返回值,auto不能作为形参,auto不能被修饰为模板参数3)auto并不会影响编译速度,因为编译时本来也要右侧推导然后判断与左侧是否匹配lambda表达式:函数式编程int a = 1, b = 2; auto multi = []
2020-08-13 14:07:23 226
原创 工厂模式
工厂模式分为3种,即简单工厂模式、工厂方法模式、抽象工厂模式,C++的工厂模式主要利用到虚函数。简单工厂简单工厂模式有一个工厂,可以生产多个产品,包含两个接口,一个是产品类的,一个是工厂类的。产品类需要有一个基类,基类中的具体产品实现需要是个纯虚函数,这样一来,产品的子类必须要重写具体的产品实现,实现不同的功能。产品类封装完成后,还需要一个工厂类,工厂类对产品类再次封装,最终实现由一个工厂对象决定创建出哪一种产品类的实例。//衣服的抽象class Clothes{public: virtua
2020-08-10 23:15:05 164
原创 GDB
GDB(GNU Debugger)是在Unix以及类Unix系统下的调试工具。功能极其强大,几乎涵盖了你所需要的全部功能。GDB主要帮忙你完成下面四个方面的功能:1.启动你的程序,可以按照你的定制要求随心所欲的运行程序。2.可让被调试的程序在你所指定的调置的断点处停住。3.当程序被停住时,可以检查此时你的程序中所发生的事,以及内存状态等。4.动态的改变你程序的执行环境。gdb使用总旨:help指令很强大,在gdb里面输入:help allgdb使用前置条件:用于编译时加入debug信息,gc
2020-08-10 22:53:42 136
原创 QT-观察者模式
观察者模式是定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新。既多个观察者都依赖于同一个被观察者的数据,当被观察对象的数据发生改变时,则所有依赖于被观察对象的观察者,都会作出各自的更新动作。例如:以不同的显示形式显示某一数据,LCD显示、Label中显示等1)定义一个被观察对象(目标),其中可以有任意多个观察者,需要提供添加和删除观察者的接口,在被观察对象中定义通知观察者接口2)定义观察者父类,添加刷新的虚函数接口3)定义不同的观察者子类,重写
2020-08-10 15:59:29 1770
原创 IO多路复用
流:指可以进行I\O操作的内核对象文件、管道、套接字等流的入口:文件描述符(fd)所有对流的读写操作,我们都可以称之为IO操作。当一个流中没有数据,read的时候,或者流中已经写满数据,再write,IO操作就会阻塞同步和异步:1)同步指用户线程发起IO请求后需要等待或者轮询内核IO操作完成后才能继续执行。2)异步指用户线程发起IO请求后仍继续执行,当内核IO操作完成后会通知用户线程,或者调用用户线程注册的回调函数。阻塞和非阻塞:1)阻塞指IO操作需要彻底完成后才返回到用户空间。2)非
2020-08-09 16:52:44 501
原创 指针函数和函数指针
指针函数指针函数: 它的本质是一个函数,不过它的返回值是一个指针。其声明的形式如下所示:ret *func(args, ...);使用举例:# include <stdio.h># include <stdlib.h>int * func_sum(unsigned int n){ static int sum = 0; //注意此次必须为静态,否则函数结束后该变量会被释放 int *p = ∑ for (int i = 0
2020-08-06 19:26:56 118
原创 C++关键字
static:C语言中的static:(1)生命周期:static修饰的变量,存储在内存的静态存储区,无论是在函数内还是函数外,生命周期都是整个程序运行期间,static修饰的函数其生命周期也是整个程序的运行期间(2)作用域:static修饰的局部变量的作用域就是定义该变量的那个作用域内,static修饰的全局变量的作用域是从这个变量定义开始到整个程序结束(3)static修饰的变量都存储在静态区(4)static修饰的变量只能作用于本文件内,即使被extern修饰也不行(5)static修饰的
2020-08-03 00:53:40 197
原创 进程间通信
- 管道匿名管道:有名管道:-消息队列函数原型:// 创建和获取 ipc 内核对象 --IPC_CREATint msgget(key_t key, int msgflag);// 将消息发送到消息队列 --IPC_NOWAITint msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);// 从消息队列获取消息 --IPC_NOWAIT/0int msgrcv(int msqid, void *msgp, size_
2020-08-01 23:45:14 86
原创 排序算法
排序算法时间复杂度是否基于比较冒泡 、插入、选择O(n^2)是快排 、归并O(nlogn)是适合小规模数据的排序:排序算法是否原地排序是否稳定实际应用冒泡排序(Bubble Sort)是是少插入排序(Insertion Sort)是是多选择排序(Selection Sort)是否少原地排序:特指空间复杂度是 O(1) 的排序算法。稳定性:若待排序的序列中存在值相等的元素,经过排序之后,相等元素之间原有的...
2020-07-29 22:58:29 184
原创 二分查找
二分查找也称折半查找(Binary Search),是一种效率较高的查找方法,前提是数据结构必须先排好序,且要求为线性表,具有有随机访问的特点(如数组)。查找的时间复杂度为 O(logN)。代码模板:left = 0;right = sizeof(arry) - 1;while(left <= right){ //防止溢出 int mid = left + (right -left)/2; if(arry[mid] == target) //匹配成功,返回结果 return
2020-07-28 23:02:11 167
原创 泛型编程 - 模板
模板是泛型编程的基础,泛型编程即以一种独立于任何特定类型的方式编写代码。模板是创建泛型类或函数公式。STL中的容器、迭代器、算法,都是泛型编程的例子,它们都使用了模板的概念。比如 向量,我们可以定义许多不同类型的向量,比如 vector 或 vector 。函数模板#include <iostream>#include <string>using namespace std;template <typename T>inline T const&am
2020-07-28 09:41:54 159
原创 sizeof(类)
我们要知道什么是类的实例化,所谓类的实例化就是在内存中分配一块地址,用sizeof对类名操作,得到的结果是该类的对象在存储器中所占据的字节大小,由于静态成员变量不在对象中存储,因此这个结果等于各非静态数据成员(不包括成员函数)的总和加上编译器额外增加的字节。确定类大小的几个原则:1.为类的非静态成员数据的类型大小之和2.有编译器额外加入的成员变量的大小,用来支持语言的某些特性(如:指向虚函数的指针)3.为了优化存取效率,进行的边缘调整4.与类中的构造函数,析构函数以及其他的成员函数无关非继承:
2020-07-28 00:03:07 450
原创 父类指针指向子类对象
#include <iostream>using namespace std; class Parent {public: Parent() { cout << "Parent Create" << endl; } ~Parent() { cout << "Parent Destroy" << endl; }}; class Child : public Parent{public: Child() {
2020-07-27 13:02:27 350
原创 斐波那契数列
斐波那契数列: F(n) = F(n-1)+F(n-2)LeetCode:(70)爬楼梯1. 递归时间复杂度:O(2^n)空间复杂度:O(n)int climbStairs(int n) { return climb(n);}int climb(int n){ //终止条件,第一阶为1,第二阶为2 if(n <= 2) { return n; } //每一阶为前两阶之和 return climb(n-1
2020-07-25 22:05:54 145
原创 BFS与DFS
BFS(Breath First Search):广度优先搜索DFS(Deep First Search):深度优先搜索BFS代码模板:通过队列遍历LeetCode:(102)二叉树的层序遍历「BFS 遍历」、「层序遍历」、「最短路径」实际上是递进的关系。在 BFS 遍历的基础上区分遍历的每一层,就得到了层序遍历。在层序遍历的基础上记录层数,就得到了最短路径BFS(TreeNode* root){ //该队列用于存放每层节点 queue<TreeNode*> q; //首
2020-07-24 00:41:42 108
原创 数据结构
链表struct ListNode{ int val; ListNode *next; //前驱指针 ListNode *pre; //后继指针};LeetCode:(206)反转链表(141)环形链表栈//栈#include <stack>stack<int> a//压入栈顶a.push();//栈顶弹出a.pop();//返回栈顶a.top();LeetCode:(20)有效的括号(232)用栈实现队列单端队列//单端队列#i
2020-07-22 23:32:52 129
原创 STL容器
一、顺序容器容器中的位置来顺序保存和访问的vector向量(动态数组)底层数据结构为数组,特性:1)支持随机快速访问:时间复杂度为O(1);2)插入或删除非尾结点:时间复杂度为O(n);3)若初始分配空间已满会引起扩容,重新申请一个 1.5 / 2 倍大的内存空间,将原空间内容拷贝过来,随后释放原空间,操作耗时。注意:插入和删除操作后会导致旧迭代器失效。list列表底层数据结构为双向循环链表,特性:1)支持快速的增删:时间复杂度为O(1);2)查找元素:时间复杂度为O(n);2)内存
2020-07-19 20:06:04 145
原创 互斥锁、自旋锁、读写锁、条件变量、信号量
互斥锁、自旋锁、读写锁、条件变量、信号量互斥锁加锁 -> 阻塞(睡眠等待sleep)-> 解锁。阻塞时会进行上下文切换,CPU可进行其他工作。函数原型:#include <pthread.h>#include <time.h>// 初始化一个互斥锁。int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *attr);// 对互斥锁上锁,若互
2020-07-07 18:25:17 472
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人