| by msbeta | No comments

改善程序的性能-C++17 使用 std::string_view避免字符串拷贝

C++中std::string是日常Coding中经常使用的一个类,使用起来非常方便,但是也存在一些弊端。

如下代码,参数传递的过程发生了内存分配(Memory Allocation)和内存拷贝。

再看下面的常用的字符串截取实现:

为了进一步的压榨程序的性能,需要移除掉这些[……]

继续阅读

Read More
| by msbeta | No comments

C++11多线程-主动让出CPU使用权(yield)

在多线程的编程中,有时候一个线程需要等待IO操作或者等待其它某个条件满足,再继续执行。为了达到这样的目的,有时我们会写出如下的代码:

这样代码的问题在于,这个循环判断的操作会使得这个线程占满CPU的时间,造成资源的浪费。我们可以在一次判断结束后,让线程主动让出自己对CPU的使用权,让操作系[……]

继续阅读

Read More
| by msbeta | No comments

C++11多线程-线程休眠(sleep)

C++ 11之前并未提供专门的休眠函数。c语言的sleep、usleep其实都是系统提供的函数,不同的系统函数的功能还有些差异。

在Windows系统中,sleep的参数是毫秒。

在类Unix系统中,sleep()函数的单位是秒。

从C++11开始,中C++标准库提供了专门[……]

继续阅读

Read More
| by msbeta | No comments

C++11新特性-std::tuple

1. 引入头文件

2. std::tuple初始化

这里要注意,不是所有的C++ 11编译器都支持copy-list-initialization的方式。如下代码所示。

3. 打印std::tuple

打印std::tuple可以将它的元素逐个打印出来,不过非常繁[……]

继续阅读

Read More
| by msbeta | No comments

C++11新特性-std::make_tuple

std::tuple是C++ 11中引入的一个非常有用的结构,以前我们要返回一个包含不同数据类型的返回值,一般都需要自定义一个结构体或者通过函数的参数来返回,现在std::tuple就可以帮我们搞定。

1.引用头文件

2. Tuple初始化

std::tuple的初始化可以通过[……]

继续阅读

Read More
| by msbeta | No comments

C++多线程编程-揪出高CPU占用的线程

在工程实践中,有很多对性能要求比较苛刻的场景,要求CPU的占用不能超过指定的阈值,以保证系统整体的实时响应。本文主要记录下如何抓出CPU占用高的线程。

假设有如下业务代码:

代码编译:

g++ cpu.cpp -o cpu -pthread -g

1.定位线程

使用[……]

继续阅读

Read More
| by msbeta | No comments

计算几何-凸包(Convex Hull)

凸包(Convex Hull)是计算几何中的一个经典常用的算法。它解决的问题在于给定空间一堆离散的点,计算包含所有点的凸多边形。

凸的定义

凸是指图形内任意两点的连线都不经过图形内部。

计算凸包时要考虑一些特殊情况,比如凸包上多点重叠,凸包上多点共线,通常我们会倾向于用最少[……]

继续阅读

Read More
| by msbeta | No comments

数据结构与算法-计算二叉树的深度和最大宽度

在数据结构中,二叉树是一种非常基础的数据结构,无论是在面试中,或者实际应用中,都有非常普遍的用途。

1.数据结构定义:

2.二叉树的深度

二叉树的深度:

根结点所在的层数为1,根结点的孩子结点所在的层数为2,以此类推,深度是指所有结点中最深的结点所在的层数。

3.求[……]

继续阅读

Read More
| by msbeta | No comments

数据结构与算法-计算二叉树中节点的最大距离

1.问题定义

如果把二叉树看做无向图,我们姑且定义二叉树的“距离”为节点之间边的个数。现在要计算二叉树中相距最远的两个节点之间的距离。

二叉树的节点距离计算有几种情况:

1) 根节点为空,路径长度为0;

2) 根节点非空的情况下,分为两种情况:

情况A: 路径经过左[……]

继续阅读

Read More
| by msbeta | No comments

动态规划-最长公共子序列

1.公共子序列

给定两个字符串m和n,如果它们的子串a和b内容相同,则称a和b是m和n的公共子序列。子串中的字符在原字符串中不要求连续,只要保持原有相对顺序即可。

例如,字符串“abcfbc”和“abfcab”,其中“abc”同时出现在两个字符串中,因此“abc”是它们的公共子序列。

[……]

继续阅读

Read More