- 博客(53)
- 资源 (1)
- 收藏
- 关注
转载 最短路径问题---Dijkstra算法详解
转载:https://blog.csdn.net/qq_35644234/article/details/60870719最短路径问题—Dijkstra算法详解
2021-06-21 09:19:27
136
原创 C++提供的原子操作
C++原子变量的操作template<class T>struct atomic; std::atomic<int> foo(10);// foo是一个整形原子变量,C++内部已经通过锁实现了原子操作,无需再加锁STL提供的实例化类型原子变量的方法引用整型变量的原子操作...
2021-06-15 10:18:46
251
原创 webrtc中peerconnection_client生成vs工程文件
下面是将peerconnection_client从整个webrtc工程文件中分离出来的过程记录一 webrtc项目的本地编译生成Ninja配置文件gn gen --target=x64 --args=“is_clang = false use_lld=false use_custom_libcxx = false use_rtti=true rtc_include_tests=false enable_iterator_debugging=true symbol_level=0 is_compone
2021-02-13 16:30:09
1945
2
原创 windows下编译WebRTC源码并运行官方demo
一、环境win10操作系统,并装有vs2019、windows sdk、git等常规开发软件。最好装上python,我用的版本是2.7二、下载源码并编译打开windows cmd命令行。//切换到webrtc的下载目录,自己新建的文件夹cd C:\webrtcset WINDOWSSDKDIR=C:\Program Files (x86)\Windows Kits\10set GYP_MSVS_OVERRIDE_PATH=C:\Program Files (x86)\Microsoft Vis
2020-11-02 22:18:22
1363
2
原创 数据库索引底层为什么采用B+树
一、前言需求:从查询角度考虑,数据库查询一般有单值查询和范围快速查询的需求。比如:根据某个具体的值快速查询,select * from users where id=999;查询某个范围的数据:select * from users where id>100 and id<200;除此之外,存储空间方面也希望不要消耗太多空间。对于常用的数据结构来说,散列表支持快速查询某个具体的值,时间复杂度O(1),但是散列表不支持范围快速查找;二叉查找树查找某个具体的值的时间复杂度可以达到O
2020-10-27 11:09:46
476
原创 声网校招面经
语音数据的格式,udp传输数据有考虑丢包的问题吗语音通话之前有建立连接吗http有哪些字段,怎么处理的http格式是设置的什么发送的http响应报文的字段是怎么填的介绍一下线程池,工作队列,线程唤醒有竞争吗大文件发送怎么实现的线程函数什么时候结束C++内存模型10.C++11、14新特性闭包了解吗,匿名函数MYSQL的所以采用什么数据结构,为什么采用B+树QUIC协议了解吗了解哪些开源软件,apache,Nginx,redis,MySQL,读过源码吗还是自己菜啊...
2020-10-26 17:25:10
532
1
原创 红黑树
一、颜色分布规则根节点是黑色的;每个叶子节点都是黑色的空节点(NIL),也就是说,叶子节点不存储数据;任何相邻的节点都不能同时为红色,也就是说,红色节点是被黑色节点隔开的;每个节点,从该节点到达其可达叶子节点的所有路径,都包含相同数目的黑色节点;二、与AVL树对比AVL树是一种高度平衡的二叉树(任何一个节点的左右子树高度差不超过1),所以查找的效率非常高,但是,有利就有弊,AVL树为了维持这种高度的平衡,就要付出更多的代价。每次插入、删除都要做调整,就比较复杂、耗时。所以,对于有频繁的插入、
2020-10-26 15:28:11
100
原创 虚拟内存学习总结
虚拟内存是操作系统的核心概念之一,操作系统使用虚拟内存来进行内存管理。虚拟内存将主存作为磁盘的缓存每一个程序在运行时都会涉及大量的数据,而这些数据在程序运行时不可能都保存在内存中。考虑一台电脑同时运行了多个应用程序,如果将每个程序的数据都拷贝到物理内存中,必然会沾满大量的内存,而且在进程切换的时候会涉及到大量数据的拷贝,效率非常低。而操作系统引入了虚拟内存的概念,应用程序的数据本来是保存在磁盘中的,只有当需要使用到这一小块数据的时候,才会将数据缓存到物理内存中,也就是说将物理内存作为磁盘的高速缓存,磁
2020-08-17 23:14:48
317
原创 小议软连接和硬链接
前言首先介绍一下inode的概念,Linux下每一个文件都有一个inode节点,inode节点存储了文件的重要信息,如下文件的访问权限文件的所有者、所属组文件的大小文件的创建时间文件的最后修改时间文件的真是数据存放的地址Linux下区分一个文件是根据inode节点而不是文件名,文件名只是方便表示而已。大概可以用上面的图来解释一个文件的真实结构。硬链接ln sourcefile hardlink可以通过这样的方式创建硬链接。创建的硬链接和源文件具有相同的inode,也就是说硬链接和
2020-08-16 21:55:49
906
转载 最优二叉树——哈夫曼树
一:什么是最优二叉树?从我个人理解来说,最优二叉树就是从已给出的目标带权结点(单独的结点) 经过一种方式的组合形成一棵树.使树的权值最小. 最优二叉树是带权路径长度最短的二叉树。根据结点的个数,权值的不同,最优二叉树的形状也各不相同。它们的共同点是:带权值的结点都是叶子结点。权值越小的结点,其到根结点的路径越长官方定义:在权为wl,w2,…,wn的n个叶子所构成的所有二叉树中,带权路径长度最小(即代价最小)的二叉树称为最优二叉树或哈夫曼树。二:下面先弄清几个几个概念:1.路径长度.
2020-08-15 22:52:16
1743
原创 函数重载的一些问题
面试问题:void fun(int, double){ cout << "int,double" << endl;}void fun(double, int){ cout << "double,int" << endl;}现在调用fun(int , int)会怎么样?函数重载的匹配过程有三步:1、确定候选函数,两个原则:1)函数名相同 2)在调用点函数可见。显然对于该题目来说两个函数都是候选函数。2、确定可行函数,也是有
2020-08-13 23:11:04
351
原创 拷贝构造函数、拷贝赋值运算符的总结
一、什么时候需要自定义拷贝构造函数一般编译器会自定义缺省的拷贝构造函数,但是当类中含有指针成员时,常常需要我们自己定义拷贝构造函数。基本原则:1、当我们需要自定义析构函数时,通常也需要自定义拷贝构造函数。2、需要拷贝构造函数时通常也需要自定义拷贝赋值运算符,反之亦然。二、 深拷贝有两种拷贝方式,深拷贝和浅拷贝。当我们自定义的类中有指针类型的数据成员时,深拷贝会更加安全。所谓深拷贝就是开辟一块新的内存空间,将另一个对象的成员逐一拷贝到新的内存空间。下面考虑自己实现一个string类,主要是自己实
2020-08-04 15:59:16
530
原创 C++多态为什么只有指针或引用能实现
只有指针和引用可以实现动态绑定,所谓的动态绑定就是指静态类型和动态类型不同。class Base{public: virtual void fun() {cout<<"Base"<<endl;}};class D:public Base{public: void fun(){cout<<"D"<<endl;}};D d;Base* base1 = &d;Base base2 = d;**静态类型:**即声明的类型,*b
2020-07-29 18:35:59
823
1
转载 #define、const区别
首先,#define 是在预处理过程中起作用,const在编译运行时起作用;#define AGE 18 对于这个预处理指令,在预处理阶段,也许所有的 AGE 都被替换为18 ,就是说编译过程中可能根本就看不到AGE这个名称。当使用AGE的语句出现编译错误时,可能会带来困扰,因为所有的错误都直接关联到18这个常量,调试时在追踪这个常量上浪费时间;#define只进行字符串替换,const还会进行类型检查,可以避免低级错误,比如使用错误的类型;从内存占用上看,#define有多少地方用就替换多少次,而.
2020-07-29 16:26:30
121
原创 C++ STL 之容器
无序容器总共有4种无序unordered_map、unordered_set、unordered_multimap、unordered_multiset就拿unordered_map来说,主要有以下几点:对外表现为key-value 键值对,可以根据key快速查找到value,查找、删除、插入的时间复杂度为O(1),常数时间;从内部存储来看,是一组桶,buckets,buckets底层由vector实现,每个桶对应哈希值不同的对象,每个桶里可能有多个对象,也可能没有对象,一个桶对应多个对象一般通过
2020-07-28 15:53:47
104
原创 定时器模块
使用定时器的原因:HTTP/1.1 默认是长连接的过多的长连接会占用服务器资源,所以服务器会用一些策略有选择地关闭长连接,比如通过定时器设置最大长连接时间管理非活动连接,超时释放资源...
2020-07-12 15:34:24
353
原创 项目中用到的线程同步机制
互斥锁APIpthread_mutex_t m_mutex;pthread_mutex_init(&m_mutex,NULL);pthread_mutex_lock(&m_mutex);pthread_mutex_unlock(&m_mutex);pthread_mutex_destroy(&m_mutex);可能发生死锁的情况:同一个线程中对已经加锁的互斥锁再次加锁,pthread_mutex_lock()会一直阻塞下去,发生死锁现在有两个线程A、B,
2020-07-09 18:15:52
211
原创 Linux IO复用
selectselect(int nfds , fd_set* readfds , fd_set* writefds , fd_set* exceptfds , struct timeval* timeout );nfds 要监听的文件描述符的总数,通常被设置为select监听的文件描述符最大值加1;readfds、writefds、exceptfds 表示可读、可写、异常事件的集合,其实就是数组,数组当中的每一位(bit)表示一个文件描述符,调用select需要传入读、写、异常事件的集合,如果文件描
2020-07-06 21:35:33
140
原创 http服务器之日志系统
一、单例模式日志系统采用了单例模式,单例模式保证一个类只有一个实例,同时提供了一个可供全局访问该实例的静态方法,该实例可以被程序的所有模块共享。实现方法:通过一个类静态成员返回局部静态实例,可供全局访问。同时私有化类的构造函数、析构函数。防止外界创建单例类的对象。二、日志系统的初始化主要包括判断同步日志/异步日志、初始化日志类的成员变量(日志的缓冲区申请内存、日志最大行数、日志的日期等)、创建日志文件(日志文件名是根据日期命名的)三、日志的写入1、首先传入的参数确定日志的具体类型目前定义有4种
2020-06-30 22:51:55
1171
原创 http服务器之线程池
线程池使用一个工作队列解除主线程和工作线程的耦合关系:主线程向工作队列中添加任务,工作线程通过竞争来取得任务并执行。就是生产者消费者模型。首先创建一个线程数组,并初始化一定数量的线程,创建完成之后将线程设为脱离线程。线程函数必须是静态成员函数,因为pthread_create()的第三个参数中的函数指针指向的线程函数的形参必须是void*类型,而类的动态成员函数作为函数参数时,this指针会作为默认参数传进成员函数中,如果线程函数是类的成员函数则与形参类型不匹配,会编译不通过。同时为了静态函数能操作类
2020-06-28 17:21:36
1053
原创 centos7 网卡消失
问题:linux虚拟机用的感觉卡,就想着优化一下子,结果一折腾,重启之后发现没有网络了,ifconfig之后只有lo 127.0.0.1这个本地地址,ens33网卡直接不见了。查找:cd /etc/sysconfig/network-scripts/发现ifcfg-ens33还在vim ifcfg-ens33打开也是一切正常解决方法:systemctl stop NetworkManager 临时关闭systemctl disable
2020-06-24 18:54:48
1273
原创 c中字符串相关的函数
#include <string.h>char str[]=" “;char* url = strpbrk( str,” \t" );//找到第一个含有空格或者\t的字符并返回strcasecmp( method,“GET” )//判断method是否等于 GET//返回从url开始不是空格或者\t的下标//即跳过url后面连续出现的空格或者、\t,使url指向真正字符串起始位置url += strspn( url," \t" );strchr( str,ch )//在str中查
2020-06-22 22:49:11
140
原创 服务器项目问题总结
网络协议GET 、POST方法的区别1、GET参数放在url中,POST参数放在消息体中,GET参数直接暴露在url中,所以GET相比POST不安全,不能传递敏感信息2、GET 可以被缓存,POST不能被缓存3、GET可以被存为书签,POST不能被存为书签4、GET的url最大有2048个字符,POST无长度限制5、后退刷新按钮,GET无害,POST会被重新提交6、GET的数据类型只能是ASCII码,而POST没有限制,可以是二进制...
2020-06-22 15:02:33
433
原创 C++多态之虚表虚指针
编译器为含有虚函数的类生成了一个虚函数表,vtable,这个表可以理解为是静态的,即属于该类,不属于实例化的对象。虚函数表中存放了该类中的虚函数,虚函数表可以理解为一维数组,存放的是该类定义的虚函数的地址。基类有基类的虚函数表,派生类有派生类的虚函数表。虚函数表在编译时生成。当然虚函数表也可以继承。同时每个含有虚函数的类在实例化时编译器会对象生成一个虚指针,vptr,虚指针在构造函数中初始化,虚指针初始化时指向该类实际指向对象的虚函数表,vtable,比如基类指针实际指向派生类,该虚指针就指向派生..
2020-06-20 16:47:27
819
原创 生成http响应并将响应报文发送给浏览器
在解析完客户端的请求报文之后,接下来就是根据解析的结果生成响应报文并发送一个应答。一、找到请求的资源文件根据解析请求报文得到的url 判断请求的资源文件是否存在并且用户是否具有可读的权限。若文件存在且可读,则调用mmap()将资源文件映射到内存中,m_file_address保存文件在内存中的地址。二、生成响应报文的状态行和头部信息生成响应报文的状态行和头部信息 可以通过具有一个可变参数的函数来完成。bool add_response(const char* format,...){ if(
2020-06-14 22:08:53
1131
原创 有限状态机解析HTTP请求报文
HTTP报文的解析过程比较繁琐,基于状态机的思想设计程序会一定程度降低复杂性。一、从状态机从状态机状态转移图从状态机三种状态LINE_OK ,完整读取一行LINE_OPEN,读取的行不完整LINE_BAD,读取的报文有误从状态机每次从缓冲区读取一行信息,直至读取到 \r\n 表示读取到一行,同时将 \r\n 替换为 \0\0 便于主状态机读取该行,然后再将行起始标志定位到下一行的起始位置。二、主状态机主状态机有三种状态CHECK_STATE_REQUESTLINE,解析请求行C
2020-06-14 17:59:51
2515
1
原创 VS远程连接调试Linux程序 ,vs找不到Linux头文件的解决办法
使用VS编写Linux程序,可以将VS连接到Linux上,却出现了VS IDE中找不到#include <sys/socket.h>这类系统头文件的情况,可以将Linux中 /usr/include/目录 手动拷贝到windows的C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Common7\IDE\VC\Linux\include\usr\ 位置简单粗暴 ,这样以来就可以不用忍受Vim了。菜鸟用vim写Linu
2020-05-31 23:37:28
4283
1
原创 epoll 的一点理解
epoll有两种模式,默认是LT的,即电平触发模式,还有一种更加高效的ET模式,边沿触发模式。这两种触发方式和以前学的数电里的电平触发和边沿触发意思差不多。epoll 的调用epoll事件表的创建通过下面的API可以创建epoll的内核事件表,调用成功后返回epoll内核事件表的文件描述符,若返回值为-1,说明调用失败。int epoll_fd = epoll_create(int size);epoll 文件描述符的操作int ret = epoll_ctl(int epfd,int op
2020-05-24 23:53:26
157
原创 Linux 常用命令
查看端口占用情况1、lsof -i:8000,查看端口8000的占用情况2、netstatnetstat -tunlp 用于显示 tcp,udp 的端口和进程等相关情况。netstat 查看端口占用语法格式:-t 显示tcp相关的进程-u 现在UDP相关的进程-n 拒绝显示别名,能显示数字的全部转化为数字-l 仅列出处于监听状态的进程-p 显示相关链接的程序名netstat -tp | grep 8000 查看占用8000端口的进程...
2020-05-23 17:26:20
150
原创 有限状态机解析HTTP请求
一、HTTP报文HTTP的报文格式:起始行头部字段空 行消息正文其中起始行和头部字段成为Header,消息正文称为body。Header和body之间一定要有空行隔开。请求行的格式:如下:GET /index.html HTTP/1.1请求方法为GET, url为/index.html,版本为HTTP/1.1而请求头部就是用 key:value 更详细的方式说明HTTP报文。而我们要做的就是解析这样的http请求,并发送应答报文给客户端。二、程序结构recv() 是从套接字中读
2020-05-20 18:58:41
3143
原创 C++多线程编程学习笔记
创建线程void* fun()//线程函数{ //...}thread t1(fun);t1.join();//t1.detach();join() 是两个线程交汇的意思,工作线程和主线程在此处交汇,jion() 之后的主线程会阻塞直到工作线程运行结束。detach() 使线程函数脱离线程对象,即当线程对象销毁了线程函数依然可能运行。通常不推荐这么做。互斥锁的使用std::mutex;std::lock_guard<T>//模板类,RAII封装,基于作用域std::
2020-05-12 15:49:43
236
原创 给定n种砝码,每种砝码的数量无限,还有一个天平,判断是否能测量任意重量的砝码
题目给定几种重量的砝码,数量不限,判断是否可以称出任意重量的物品。输入规则,第一行输入一个整数n,表示有n种砝码;然后挨个输入每个砝码的重量。可以称重的物品都是整数。能,就输出YES;不能,输出NO。示例1输入:11输出:YES第一个1是有一种重量的砝码,第二个1是这个砝码是多重。这样肯定可以称出任意重量的物品。示例2输入:22 3输出:YES第一个2是有两种重量的...
2020-05-06 18:58:05
2133
原创 类的静态成员变量初始化时间
首先先搞明白 声明、定义、初始化类的静态成员变量在类内声明,可以多次声明类的静态成员必须在类外定义,定义就是给变量分配内存,初始化就是给一个变量赋初值,内置类型通常定义时默认初始化类静态成员变量在main函数执行前完成初始化,有静态初始化和动态初始化static initialization: 静态初始化指的是用常量来对变量进行初始化,主要包括 zero initialization 和...
2020-05-02 14:28:37
4322
原创 Qt核心机制信号与槽的原理浅析
Qt 中的信号与槽机制对于界面开发来说是非常方便的,界面上会有各种各样的部件,而这些部件之间常常需要通信,比如点击一个按钮,会触发一个效果,点击按钮就是一个信号,触发的效果就是一个槽函数。信号与槽还可以用来进行线程之间的通信,并且是线程安全的。简要说一下信号与槽的底层原理。信号与槽的实现是借助了Qt 的元对象系统,元对象系统有一个元对象编译器,程序编译之前会有一个预处理过程,预处理将一个类/对...
2020-04-28 18:06:14
1847
1
原创 20200426每日学习小结——排序算法
回顾排序算法并实现一遍算法名称稳定性时间复杂度空间复杂度冒泡排序稳定排序最好O(n),最差O(n^n),平均O(n ^n)O(1)插入排序稳定排序O(n),O(n*n),O(n)O(1)选择排序不稳定排序最好O(n),O(n^n)O(1)归并排序稳定排序时间复杂度一直是O(n*logn)O(n)快排不稳定排序最好是O(n...
2020-04-27 23:20:39
113
原创 20200427 学习小结C++智能指针
shared_ptr 共享指针一、初始化1、默认初始化shared_ptr<int> ptr;//默认为空指针2、使用make_sharedshared_ptr<int> ptr=make_shared<int>(10);3、借助内置指针初始化shared_ptr<int> ptr(new int (10));二、智能指针如何自...
2020-04-27 23:19:46
167
转载 C++11常用新特性快速一览
最近工作中,遇到一些问题,使用C++11实现起来会更加方便,而线上的生产环境还不支持C++11,于是决定新年开工后,在组内把C++11...
2020-04-23 10:47:07
158
myselfSignalSlot.zip
2020-04-28
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人