随笔分类 - C/C++
1
C语言、C++相关知识点备忘
摘要:从C++取地址操作看对象内存布局 对于一个C++对象,取地址存入一个指针,不同类型的指针拿到的值是一样的吗? 答案是不一定! 我们直接考察带虚函数的单继承和多继承两种场景。 测试样例 示例代码如下: #include <stdio.h> #include <stdint.h> class A { p
阅读全文
摘要:数组指针、指针数组、二维数组 蛋总常说“凡事必有初”,写下这篇博客的初衷在于: 今天尝试用指针的方式访问一个大二维数组,而又不想用一维数组人工计算偏移量,于是有了指针数组与数组指针的探索。结论是数组指针。 二维数组 我们在开辟一个二位数组的时候似乎很简单。 比如要开辟一个第一二维度分别是5和8的in
阅读全文
摘要:LeetCode 71. 简化路径 一道简单的题目,重点是演示C++如何简单实现按照指定字符分割字符串。 题目描述 给你一个字符串 path ,表示指向某一文件或目录的 Unix 风格 绝对路径 (以 '/' 开头),请你将其转化为更加简洁的规范路径。 在 Unix 风格的文件系统中,一个点(.)表
阅读全文
摘要:C++ 构造函数 & 析构函数 美团二面被问了一个问题,没有答上来,今天整理一下相关知识。 问:为什么析构函数要声明成虚函数? 涉及到虚函数,表明这个问题实际上和多态有关系,具体来讲是用基类指针指向的子类对象如何虚构的问题。 举个例子,以下函数的输出是什么? 典型代码 #include <bits/
阅读全文
摘要:协程库中 WaitGroup / CountDownLatch 实现 这几天读了一些协程的文章。看了看开源协程库,在腾讯的 libco 和魅族的 libgo 中选择了 libgo,结果发现这边提供了协程池,但却没有提供CountDownLatch、SyncClosure之类的设置,要是每次起一组任务
阅读全文
摘要:简单C++线程池 Java 中有一个很方便的 ThreadPoolExecutor,可以用做线程池。想找一下 C++ 的类似设施,尤其是能方便理解底层原理可上手的。网上找到的 demo,基本都是介绍的 projschj 的C++11线程池。这份源码最后的commit日期是2014年,现在是2021年
阅读全文
摘要:switch 比 if/else 效率更高? 在很多人的概念里,switch 的执行效率是比 if/else 高的。依据就是很多人以为的,if/else 是用了多次比较判断,而 switch 是用的跳转表一次跳转。事实真的是这样吗? 考察以下几个例子,switch 改成 if/else 之后效率会变
阅读全文
摘要:C++ 编译期计算 模板元编程是个强大的工具,据说足以作为一门完备的语言了。这里只是简单记录一下,利用模板实现编译期计算的方式。 sum([1,...n]) #include <stdio.h> // 递推公式 template<int n> class Sum { public: static c
阅读全文
摘要:通过一道题,记录C++ stringstream 的使用。 题目描述 newcoder 上练习基本io的一道题,题目大意是说,输入有多行,每行多个单词,以空格分隔,要求对每一行的单词按字典序排列后重新输出,依然用空格分隔。 例如,输入: a c bb f ddd 输出: a bb c ddd f 解
阅读全文
摘要:LeetCode 1115. 交替打印FooBar 学到了一个新东西叫 this_thread。 题目描述 我们提供一个类: class FooBar { public void foo() { for (int i = 0; i < n; i++) { print("foo"); } } publ
阅读全文
摘要:LeetCode 973. K Closest Points to Origin 题目描述 Given an array of points where points[i] = [xi, yi] represents a point on the X-Y plane and an integer k
阅读全文
摘要:priority_queue 自定义 comparator LeetCode 373. Find K Pairs with Smallest Sums 本文重点记录需要自定义 comparator 时的priority_queue 的写法。 题目描述 You are given two intege
阅读全文
摘要:LeetCode 436. Find Right Interval 一道需要自定义比较函数的二分查找题。 这里重点展示自定义比较,给出比较函数、比较器、lambda三种写法。 题目描述 You are given an array of intervals, where intervals[i] =
阅读全文
摘要:shared_ptr shared_ptr 是通过引用计数的方式实现的,这里结合一个单线程的参考实现进行解释。注意,这种实现并不是线程安全的。STL 的 std::shared_ptr 也不是线程安全的,两个成员变量的修改并不是一次操作完成的,使用时需要加锁。 参考实现 namespace smar
阅读全文
摘要:const:指针常量与常量指针 const与指针的结合方式有时候令人迷惑,如: int * a0; int * const a1; int const * a2; const int * a3; int const * const a4; const int * const a5; const in
阅读全文
摘要:现代操作系统的内存分配以页为单位进行管理,而页通过段进行管理,组成了段页式内存管理。 本文对C++程序的各段进行简单的区分,并厘清各段在可执行程序与进程中的状态关系。 程序大体被划分为两部分,只读部分和读/写部分,这源于历史上ROM和RAM两类存储器的划分。尽管现代存储器的发展早就突破了这种分类方式
阅读全文
摘要:组合数计算 计算组合数的题目及其变体还是比较常见的,这里记录一下几种经典解法。 我们以一个典型问题为例进行讨论: LeetCode 62. Unique Paths,问的是 mxn 的矩阵从左上走到右下有几种走法,每次只能向下走或者向右走。 动态规划 第一种解法是DP,采用递推公式 \(C(m, n
阅读全文
摘要:LeetCode 315. 计算右侧小于当前元素的个数 You are given an integer array nums and you have to return a new counts array. The counts array has the property where cou
阅读全文
摘要:在做一道简单题的时候,遇到了一个奇怪的问题。 LeetCode 532. K-diff Pairs in an Array 题目描述 Given an array of integers nums and an integer k, return the number of unique k-dif
阅读全文
摘要:C++里对于变化长参数已经有了较好的处理方案,这里对C语言的变长参数进行一个简答的总结。主要分为两块:函数和宏。 函数的变长参数 常见于printf系列函数,以printf的实现为例: int printf (const char *format, ...) { va_list arg; int d
阅读全文
1

浙公网安备 33010602011771号