
C++
文章平均质量分 83
龙虾天天
未来看现在,是否无遗憾
展开
-
Heap题型套路
1 heap简介heap本质上是用Array或者vector实现的完全二叉树,这个tree的root节点代表整个heap的最大值(max_heap)或最小值(min_heap)。常用于解决Top K问题。C++并没有将heap作为容器,而是作为算法放到< algorithm>中,默认是max_heap,但是也可以通过指定比较算法构造min_heap。heap的低层机制vector本身就是一个类模板, 常用的API有以下几个:std::make_heap(RandomIt first,原创 2021-12-31 20:34:49 · 580 阅读 · 0 评论 -
C++ STL源码剖析 -- 二叉堆
1 二叉堆二叉堆,就是一种完全二叉树,即整个二叉树除了最底层的叶子节点之外,是填满的,而最底层的叶子节点中间也没有空隙,如下图所示:使用数组层级存储| * | A | B | C | D | E | F | G | H | I | J |如果0位置保留,从1位置开始保存根节点,那么i位置的某个节点,其左孩子节点必定在2i位置,其右孩子节点则在2i+1位置,其父节点则位于i/2。如果0位置使用,从0位置开始保存根节点,那么i位置的某个节点,其左孩子节点必定在2i+1位置,其右孩子节点则在2i+2位原创 2021-12-27 20:54:30 · 579 阅读 · 1 评论 -
C++同步并发操作
何时需要线程同步线程完成前,需要等待另一个线程执行线程需要等待特定事件发生线程等待某个条件变为true线程同步的方式持续检查共享标记void wait_for_flag() { std::unique_lock lock(m); while (!flag) { lock.unlock(); lock.lock(); } do_something();}等待线程在检查间隙void wait_for_flag原创 2021-12-19 18:39:46 · 864 阅读 · 0 评论 -
C++线程间共享数据
通常我们使用锁保护线程间共享数据,这也是最基本的方式。当访问共享数据前,使用互斥量将相关数据锁住,再当访问结束后,再将数据解锁。线程库需要保证,当一个线程使用特定互斥量锁住共享数据时,其他的线程想要访问锁住的数据,都必须等到之前那个线程对数据进行解锁后,才能进行访问。这就保证了所有线程能看到共享数据,而不破坏不变量。1 使用互斥量C++提供 std::mutex创建互斥量,通过调用 lock()上锁,unlock()解锁。为方便使用,C++提供RAII语法的模板类 std::lock_guard()原创 2021-12-18 19:48:25 · 1025 阅读 · 0 评论 -
[转]C++ 程序员必读书目清单
多读一些优秀的书籍,对于开发者稳固编程基础、提高编程技能有很大帮助。但是,大多时候,初学者不知道应该读什么书入门,有一定基础的开发者不知道如何进阶。 本文总结了一个C++优秀书籍清单,希望能够为你带来一定的帮助。这些书大多数都有中文版,并且可以很容易在网上找到。 阶段 1 《Essential C++》 这是一本内容不多但很实用的C++入门书籍,强调快...原创 2012-06-10 11:21:58 · 128 阅读 · 0 评论 -
[转]函数式宏定义与普通函数
在C及C++语言中允许用一个标识符来表示一个字符串,称为宏,该字符串可以是常数、表达式、格式串等。在编译预处理时,对程序中所有出现的“宏名”,都用宏定义中的字符串去代换,这称为“宏代换”或“宏展开”。宏定义是由源程序中的宏定义命令完成的。宏代换是由预处理程序自动完成的。若字符串是表达式,我们称之为函数式宏定义,那函数式宏定义与普通函数有什么区别呢?我们以下面两行代码为例,展开描述:...原创 2012-06-28 10:52:54 · 118 阅读 · 0 评论