![](https://img-blog.csdnimg.cn/20201014180756738.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构
文章平均质量分 80
步基
深耕音视频领域,系统架构
展开
-
面试常见算法
俗话说面试造火箭,工作拧螺丝,IT人必须接受这个现实问题。一般的面试过程中,即便学历、行业背景、年龄、距离、开发语言、技术栈、项目经历等细节都合适,可能在写算法这一关错过。说明算法是很重要的,数据结构,五大常用算法:分治法,贪心算法,动态规划,分支限界法等还是复习一下为好。LeetCode刷题。时间复杂度是一个算法运行所需要的时间。空间复杂度是一个算法运行所需要的储存空间。一 二叉树二叉树生成(先序或层次)非递归遍历算法思想:层次:根节点入队列开始循环,输出当前节点,出队列,左.原创 2021-11-17 16:17:21 · 386 阅读 · 0 评论 -
线程池设计要点
应用场景:1. 高并发、任务执行时间短的业务怎样使用线程池?2. 并发不高、任务执行时间长的业务怎样使用线程池?3. 并发高、业务执行时间长的业务怎样使用线程池?线程池本质上是生产者和消费者模型,包括三要素: 往线程池队列中投递任务的生产者; 任务池队列; 从任务池队列取出任务执行的 worker 线程(消费者)。 线程池任务特性:1 根据任务的性质来分: CPU 密集型任务; IO 密集型任务; 混合型任务。 2 根据任务原创 2022-03-17 10:59:31 · 564 阅读 · 0 评论 -
c++内存池
内存池出现原因:内存碎片 首先我们需要明确, 内存池的目的到底是什么? 首先你要知道的是, 我们每次使用new T来初始化类型T的时候, 其实发生了两步操作,一个叫内存分配, 这一步使用的其实不是new而是operator new(也可以认为就是C语言中的malloc), 这一步是直接和操作系统打交道的, 操作系统可能需要经过相对繁琐的过程才能将一块指向空闲内存的指针返回给用户, 所以这也是new比较耗时的一部分, 而第二步就是使用构造函数初始化该内存, 这是我们比较熟悉的. 既然内存分.原创 2022-03-10 10:56:33 · 2531 阅读 · 3 评论 -
STL迭代器失效总结
一、序列式容器(数组式容器)对于序列式容器(如vector,deque),序列式容器就是数组式容器,删除当前的iterator会使后面所有元素的iterator都失效。这是因为vetor,deque使用了连续分配的内存,删除一个元素导致后面所有的元素会向前移动一个位置。所以不能使用erase(iter++)的方式,还好erase方法可以返回下一个有效的iterator。1 for (iter = cont.begin(); iter != cont.end();)2 {3 (*it)-&原创 2022-03-08 11:53:40 · 1184 阅读 · 0 评论 -
std::map原理
std::map,有序,采用rb tree底层实现。std::unordered_map,无序节点Node 有 5 个成员,除了 left、right、data,还有 color 和 parent。C++实现,位于bits/stl_tree.h/** * Non-template code **/enum rb_tree_color { kRed, kBlack };struct rb_tree_node_base{ rb_tree_color color_;原创 2022-03-08 10:53:21 · 4807 阅读 · 0 评论 -
冒泡排序详解
冒泡排序。它的主要排序思想就是重复交换相邻的两个反序元素。我们用从小到大排列整数来说明这个过程: 第一轮首先处理第1个数和第2个数,使这两个数从小到大排列,然后在前次处理后的基础上处理第2个数和第3个数使其从小到大排列,以此类推,直到处理完第n-1个和第n个数,这样第一轮处理结束。 这时最后一个数(第n个元素)必定就是所有数中的最大数。 重复上面的过转载 2017-02-06 18:15:01 · 241 阅读 · 0 评论