
c/c++笔面应用实战
自C++11起脱胎换骨,C++理论基础是面试的常考点。拥有深刻的理论认知,才能指导新版C++开发及webrtc等大型音视频项目中的实战。
优惠券已抵扣
余额抵扣
还需支付
¥29.90
¥99.00
购买须知?
本专栏为图文内容,最终完结不会低于15篇文章。
订阅专栏,享有专栏所有文章阅读权限。
本专栏为虚拟产品,一经付款概不退款,敬请谅解。
等风来不如迎风去
音视频行业深耕多年,熟悉会议、直播、RTC,对在线教育、娱乐秀场等音视频端到端技术及系统架构有深入研究
展开
-
【engine】在ui线程里同步调用get、set
ui_thread_sync_call原创 2022-08-05 21:09:14 · 128 阅读 · 0 评论 -
【engine】RtcSyncCallback回调、回调容器RtcCallbackContainer及MediaPacketSenderImpl 中回调使用
RtcCallbackContainer原创 2022-08-03 08:05:31 · 54 阅读 · 0 评论 -
【QT】日志路径的字符编码转换正确方式
wstring utf8原创 2022-07-20 20:50:56 · 98 阅读 · 0 评论 -
【c++】打印线程id
thread id原创 2022-07-15 11:48:06 · 294 阅读 · 0 评论 -
【C++】sigslot 代码分析,三种 线程机制(mt_policy)及使用
sigslot原创 2022-07-14 16:09:56 · 213 阅读 · 0 评论 -
【c++】SPDLOG动态库和静态库、异步日志库hang 问题、registry核心类
spdlog SPDLOG_INLINE原创 2022-07-13 11:51:03 · 226 阅读 · 0 评论 -
【c++】以exe名字命名日志文件
exename原创 2022-07-07 00:44:47 · 50 阅读 · 0 评论 -
【agora】get 一个 agora_refptr 对象的用法示例
agora_refptr原创 2022-06-27 17:31:38 · 99 阅读 · 0 评论 -
【c++】基于std list的 webrtc::AudioFrame 的 buffer cache
audioframe buffer cache原创 2022-06-03 01:02:53 · 53 阅读 · 0 评论 -
【alloc】agora_alloc 和 agora_free
alloc原创 2022-06-03 00:18:17 · 39 阅读 · 0 评论 -
【c++】AutoPtr
autoptr原创 2022-06-03 00:15:53 · 37 阅读 · 0 评论 -
【c++】c++11 实现定时器 : 同步、异步
看到一个没有用epoll timer 这样的机制实现的定时器里面是用线程阻塞等待实现的vtimer#ifndef TIMER_H_#define TIMER_H_#include<functional>#include<chrono>#include<thread>#include<atomic>#include<memory>#include<mutex>#include<condition_var..原创 2022-05-27 11:52:12 · 115 阅读 · 0 评论 -
【C++】时间
uint64_t now_ms() { return std::chrono::duration_cast<std::chrono::milliseconds>( std::chrono::system_clock::now().time_since_epoch()) .count();}uint64_t tick_ms() { return std::chrono::duration_cast<std::chrono::mil...原创 2022-05-21 00:11:45 · 68 阅读 · 0 评论 -
【C++】C26816 指针指向堆栈上分配的内存。
严重性 代码 说明 项目 文件 行 禁止显示状态警告 C26816 指针指向堆栈上分配的内存。 G:\CDN\PUSH\obs-studio-27.2.4\broadcast-engine\sources\SourceProperty\AppWindowCaptureSourcePropertyImpl.cpp 44 堆栈分配的内存,函数返回后就自动销毁了,会导致程序崩溃改为类的成员函数...原创 2022-05-18 12:21:53 · 104 阅读 · 0 评论 -
【C++】剑指 Offer 22. 链表中倒数第k个节点 (-)
地址一次性通过但可以看到内存肯定耗费比较多,因为我额外搞个一个vector 存指针。我的代码/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public: ListNod..原创 2022-05-18 10:33:10 · 63 阅读 · 0 评论 -
【C++】剑指 Offer 21. 调整数组顺序使奇数位于偶数前面 (-)
加了保护还报错难道是因为输入了 空的,导致异常?加了[] 判断【1,3,5】 过不了就加上这个break 就都ok了。这是因为 在后面j 位置,拿到了一个奇数,这个时候需要在j之前,遍历到一个偶数,位置i,二者对调。当j 发现遍历过来的i 跟自己一样了,就如同[1,3,5],i和j都是2了,说明了啥,说明j 前面都是奇数,没有偶数啊。这个时候就直接break掉内层的while ,然后break掉外层的while,退出执行。如果不加找不到就break掉外层的这个逻辑,会有.原创 2022-05-18 00:46:00 · 55 阅读 · 0 评论 -
【C++】剑指 Offer 18. 删除链表的节点
1 应该难点在待删除的结点的前一个结点如何保存?通过独立的变量prev保存2 头尾结点要注意刚好是头结点单独搞了一个判断3 结束条件:while p ,p 是当前那个我出错的地方: p->next 为空,说明是最后一个,我break了那么当前结点就得不到判断了。竟然么有删掉?找到问题了保存prev的时候,用了已经后移的p赋值应该先保存prev,然后,移动p但还有错误:如果待删除是最后一个,删不掉:原来是之前思路不清晰的时候,加的最后一个结点的判断..原创 2022-05-17 22:49:38 · 85 阅读 · 0 评论 -
【C++】剑指 Offer 17. 打印从1到最大的n位数
剑指 Offer 17. 打印从1到最大的n位数原创 2022-05-16 01:07:06 · 755 阅读 · 0 评论 -
【C++】剑指 Offer 15. 二进制中1的个数
剑指 Offer 15. 二进制中1的个数题解里个技巧,还没看。土方法是考察移位这个知识点的。看起来移位的用法是想对了输入的是 11111111111111111111111111111101 这样的一个uin32移位 >>1 ,这是右移一位,最左边补0跟1 与,1的前面是31个0 的意思。我的代码class Solution {public: int hammingWeight(uint32_t n) { //这东东输入的是0..原创 2022-05-16 00:09:58 · 29 阅读 · 0 评论 -
【c++】剑指 Offer 11. 旋转数组的最小数字 二分查找(待续)
我的解法比较low大神们分析的头头是道,直接二分法查找这种旋转数组是分为两部分的只需要去掉尾部含有的连续的相同的元素就可以适用二分查找法查找的是个啥呢?应该是中间那个最小值的位置随想大神分析的依旧很到位0189.旋转数组.md给出了跟我类似的low解法和二分法知乎掘金林小鹿 大神的图神了剑指 Offer 11. 旋转数组的最小数字为了便于分析,我们先将数组中的数画在二维坐标系中,横坐标表示数组下标,纵坐标表示数组数值,我们发现除了最后水平的一段(黄..原创 2022-05-15 23:46:30 · 50 阅读 · 0 评论 -
【C++】剑指 Offer 11. 旋转数组的最小数字
我的这种解法是不登大雅之谈堂的。数据量大,那么效率就低。而且还要处理 一个元素这种特例。文内详述。知乎上有位大神也是跟我一样的思路方程式实验中学他解释的比我好:既然是旋转的,那么数组的是数值规则应该是:递增+最小值+递增,最大值和最小值紧挨着,所以只要看哪里不是递增的就知道最小值在哪。代码如下:public class MinArray { public static int minArray(int[] numbers) { //min默认初始值就是第一个..原创 2022-05-15 23:38:29 · 47 阅读 · 0 评论 -
【C++】剑指 Offer 10- II. 青蛙跳台阶问题
0070.爬楼梯.md这位大神解释的思路,已经很到位了。大神,这就是斐波那契数列如图, 大神自己推导的思路是n 楼梯的方法数目是由n-1 和n -2 楼梯方法数目之和。自己列举了一下,果然是这样的规律:大神对于dp[0] 说不考虑,但是我看不考虑会报错:dp【0】=1class Solution {public: int numWays(int n) { int dp[101]; dp[0] = 1; dp[1..原创 2022-05-14 23:58:37 · 40 阅读 · 0 评论 -
【C++】剑指 Offer 10- I. 斐波那契数列
剑指Offer10-I.斐波那契数列 大神的讲解:取余Tips : 设正整数x, y, z ,有取余公式:(x + y) % z = (x % z + y % z) % z按照题意递归写,直接超出时间限制求f(n)就是分别求f(n-1)和f(n-2),然后递归执行下去class Solution {public: int fib(int n) { if(n == 0) { return 0; ..原创 2022-05-14 17:16:38 · 72 阅读 · 0 评论 -
【C++】剑指 Offer 06. 从尾到头打印链表
由于前面两个题目是stack的所以感觉找到帮手了,结果还是出错了。基础不牢啊。出错了感觉这个是最简单的吧,结果还是出错了链表的第一个元素竟然么有出来又错了,header->next 可能是空指针的又错了,这下少了最后一个输入的终于该对了,代码比之前都简单直接用指针p挨个指向单链表的每个结点p 就拿到 next 的值就可以逐个向下p 为null ,就是列表遍历结束了,此时p是租后一个结点的next域了。/** * Definition..原创 2022-05-14 14:13:57 · 85 阅读 · 0 评论 -
【C++】剑指 Offer 05. 替换空格
剑指 Offer 05. 替换空格大神分析在网络编程中,如果URL参数中含有特殊字符,如空格、'#‘等,可能导致服务器端无法获得正确的参数值。我们需要将这些特殊符号转换成服务器可以识别的字符。转换的规则是在’%‘后面跟上ASCII码的两位十六进制的表示。比如空格的ASCII码是32,即十六进制的0x20,因此空格被替换成"%20"。再比如’#'的ASCII码为35,即十六进制的0x23,它在URL中被替换为"%23"。请实现一个函数,把字符串 s 中的每个空格替换成"%20"。示例 1:输入原创 2022-05-14 13:49:11 · 50 阅读 · 0 评论 -
【C++】C++Sting函数大全
reserve 预留空间resize 重新分配空间C++Sting函数大全C++Sting函数大全大神列举了所有用法:#include <string>// 注意是<string>,不是<string.h>,带.h的是C语言中的头文件using std::string; using std::wstring;或using namespace std; string类的大部分函数:begin 得到指向字符串开头的Iterator...原创 2022-05-14 12:32:41 · 49 阅读 · 0 评论 -
【C++】剑指 Offer 03. 数组中重复的数字
剑指 Offer 03. 数组中重复的数字https://leetcode.cn/problems/shu-zu-zhong-zhong-fu-de-shu-zi-lcof/solution/mian-shi-ti-03-shu-zu-zhong-zhong-fu-de-shu-zi-b-4/官方的HashSet 是java的看起来跟我的思路是一样的,只是我用map代替了hashsetstd map 的遍历方法内存耗费较大,耗时比较多这里一定要返回int所以搞了一原创 2022-05-14 09:20:14 · 38 阅读 · 0 评论 -
【C++】剑指 Offer 30. 包含min函数的栈
剑指 Offer 30. 包含min函数的栈题目不是说没有元素,top就返回false而是top一定要返回一个int值这个时候,vector 在没有元素的时候,不知道返回个啥换用stack,看了下stack的操作,都是 o1的,stack 直接top 返回,好像也会报错:9/19 无法通过最后一个值是min,并不是top 出错看了下大神的写法,关键是是用std min 来返回std min 比直接 比较,有什么不可告人的高等智慧? int原创 2022-05-14 08:36:47 · 41 阅读 · 0 评论 -
【C++】剑指offer:两个栈实现队列
剑指offer2 地址队列是尾部进入,头部做删除,对应了题目的俩funcabc 入,队头就是a,栈是先入后出,cba入,那么栈顶就是a所以要删除队头a,a 如果先入栈1,那么再栈底,没有办法删掉。那么,把栈1数据转移到栈2, 最先压入栈1的a,出栈1,放入栈2,之后,就变为栈2的顶了。所以出栈就是从栈1 转移到栈2后,出栈。如果栈2,没有,并且栈1 也没有这时候返回-1如果栈2 没有,栈1有,那么从栈1做转移。这个时候,栈1要全部转移到栈2, 才能找到自己的队列头的第一个元素,出现再..原创 2022-05-14 01:16:28 · 40 阅读 · 0 评论 -
【CicadaPlayer】HLS: SegmentTracker 线程创建 和销毁
大神自己实现的线程类: afThread虽然工程依赖于pthread,但是afThread 是c++11 实现的。SegmentTrackerSegmentTracker 会创建一个线程,跟踪m3u8获取改变了的ts地址传递lambda表达式:[this]() -> int { return this->func(); }NEW_AF_THREAD 传递一个线程方法func创建一个afThread, 线程名字就是 LOG_TAG#define NEW_A..原创 2022-05-10 15:23:43 · 141 阅读 · 0 评论 -
【Timestamp】
参考 Edward-Elric233 的代码参考XOP 的代码 : 使用高精度时钟 std::chrono::time_point<std::chrono::high_resolution_clock> 使用 std::chrono::system_clock; 系统时钟使用 std::chrono::system_clock; 系统时钟时间点: system_clock::time_point class Timestamp : copyable { ..原创 2022-03-18 11:46:17 · 130 阅读 · 0 评论 -
【noncopyable 】派生类无法进行拷贝构造和拷贝赋值
参考 Edward-Elric233 大神的代码noncopyablehttps://github.com/Edward-Elric233/sub_muduo/blob/master/base/noncopyable.h/*! * 使得派生类无法进行拷贝构造和拷贝赋值 */ class noncopyable { public: //拷贝构造 noncopyable(const noncopyable&) = delete; ..原创 2022-03-18 10:55:34 · 127 阅读 · 0 评论 -
【c++】factory的使用:create和destory,以cicadaplayer的render实现为例
webrtc里大量的factory用来屏蔽具体impl 来创建某一抽象类的过程cicadaplayer也使用了,调用方只需要使用create方法就可以创建create方法可以传递参数的。调用AudioRenderFactory 和 videoRenderFactoryG:\CicadaPlayer\framework\render\renderFactory.cpp//// Created by moqi on 2019-08-20.//#include "render..原创 2022-02-23 21:04:51 · 184 阅读 · 0 评论 -
【c++11】STD condition_variable 返回值,以cicadaplayer的SegmentTracker::threadFunction()为例
condition_variable 提供了一个例子condition_variable 实现线程间通信#include <iostream>#include <string>#include <thread>#include <mutex>#include <condition_variable> std::mutex m;std::condition_variable cv;std::string data;bo..原创 2022-02-22 00:29:37 · 80 阅读 · 0 评论 -
【c++】日志格式化输出:以cicadaplayer为例
输出形如 如下的日志:2022-02-21 19:04:31.411 0 0 D [0.9] [ApsaraPlayerService]: cur_buffer_duration -1 not enough duration_v -1 duration_a -12022-02-21 19:04:31.414 0 0 E [0.9] [HLSStream]: [read]return EAGAIN 日志格式化:决定了输出的样式static void full_format_log(int pr..原创 2022-02-21 20:49:20 · 442 阅读 · 0 评论 -
【GO】项目配置
不需要使用 clash的代理?使用 go env -w GOPROXY=https://goproxy.cn1 加入proxy上面不管用,那么直接命令行:2 go env -w GOPROXY=https://goproxy.cngo env -w GOPROXY=https://goproxy.cn整理依赖可以使用go mod tidy 来整理依赖PS G:\CDN\LiveServiceMesh\goflv-analyzer> go mod tidyPS G..原创 2022-02-03 17:07:43 · 168 阅读 · 0 评论 -
【PackUnPack】htonl、htons、ntohl、ntohs函数实现
网络字节序是大端参考:htonl、htons、ntohl、ntohs函数实现判断是大端还是小端小端时,(ENDIANNESS==‘l’)static union { char c[4]; unsigned long mylong; } endian_test = {{ 'l', '?', '?', 'b' } }; #define ENDIANNESS ((char)endian_test.mylong) #include<stdio.原创 2022-02-03 16:32:22 · 74 阅读 · 0 评论 -
【libevent】UDP 端口bind
G:\CDN\LiveServiceMesh\event\libevent-2.1.12-stable\sample\dns-example.cdns-example.c 里使用了UDP服务器首先创建socket创建地址(ip port)bind 到 地址代码 //服务器模式时的UDP绑定 if (o.servertest) { //创建UDP socket evutil_socket_t sock; struct sockaddr_in my_addr; sock..原创 2022-01-31 13:12:32 · 793 阅读 · 0 评论 -
【C++】libevent evtdns :日志回调 输出 控制台
声明日志回调注册fprintf 输出stderr 控制台声明日志回调类型:evdns_debug_log_fn_type/** A callback that is invoked when a log message is generated @param is_warning indicates if the log message is a 'warning' @param msg the content of the log message */typedef ..原创 2022-01-28 13:43:15 · 583 阅读 · 0 评论 -
【windows】命令行解析 getopt
以libevent为例:命令行输入:%s [-x] [-v] [-c resolv.conf] [-s ns] hostnamedns example 的命令行解析 int opt; struct event_base *event_base = NULL; struct evdns_base *evdns_base = NULL; memset(&o, 0, sizeof(o)); if (c < 2) { fprintf(stderr, "syntax:..原创 2022-01-28 13:36:44 · 1046 阅读 · 0 评论