Yihua's Blog

Work hard and keep simple.

漫谈C++——从编译期常量到constexpr(二)

C++学习笔记

C++11标准前的编译期运算 在第一篇文章中,我把主要精力放在了什么是编译期常量,以及编译期常量有什么作用上。在这一篇文章中,我将更详细地介绍编译期常量是如何产生的。之所以要把编译期常量了解的这么透彻,是因为他是编译期运算的基础。在这篇文章中还会讲解我们在C++11 标准前都可以用做哪些编译期运算(compile-time calculations),通过了解这些比较原始的方法,我们能够更...

漫谈C++——从编译期常量到constexpr(一)

C++学习笔记

从编译期常量谈起 C++20都支持虚函数的constexpr了,我打算用三篇读文章讲清楚编译期常量和constexpr这个东西和编译期常量的关系,即为什么需要他来辅助解决这个问题。最后帮助读者在实际编码过程中能够有意识地去运用他们,这才是终极目标。这篇文章中会讲到隐藏在日常编程中的各种编译期常量,以及他们存在的意义。 什么是编译期常量 想要用编译期常量就要首先知道它们是什么,一般出现在...

漫谈C++——C++17新特性之std::optional

C++学习笔记

C++17新特性之std::optional C++ 17 在 STL 中加入了许多新的”vocabulary types”,这些类型时用在不同组件的接口处的。MSCV也在Visual Studio2017中添加了对诸如std::optional, std::any和std::variant的支持。在这篇文章中,我们就来看一下std::optional解决了哪些问题,以及如何正确使用它。 ...

漫谈C++——用了这么久,你真的懂nullptr吗

C++学习笔记

用了这么久,你真的懂nullptr吗? 你是否在混着用NULL和nullptr? 你是否分不清这二者到底有什么区别? 滥用NULL到底会带来什么不可思议的错误? 今天,我们就来讨论讨论nullptr这个空指针的救世主。在C++11之前,几乎所有人写代码时对NULL又爱又恨,爱是因为他确实能够起到空指针的作用,恨是刚躲过了这个坑,又遇见了那个妖,魑魅魍魉怎么它就这么多。还好,C++11给我...

漫谈C++——起底万能指针void*

C++学习笔记

起底万能指针void* 从一个惨案说起 在一个项目中,我们开发的同学需要调用算法同学提供的一个接口,这个函数除了所有必要的参数之外,最后还有一个“多余的“参数void*类型,即一个可以指向任何类型的指针。这个参数之所以存在,是因为这个接口是一个算法过程的入口,在算法的最后会自动调用一个回调函数callBack,回调函数是我们自己定义的,可以用来回收所传进去的void*参数所开辟的内存,整...

漫谈C++——右值引用与移动语义

C++学习笔记

右值引用与移动语义 引子——左值持久、右值短暂 在C++11以前,所有引用都是左值引用(lvalue reference)——对左值的引用。lvalue这个词来自于C语言,指的是可以放在赋值表达式左边的对象,这些对象都是在对上或栈上分配的命名对象,他们有明确的内存地址。相对应的右值rvalue,如文字常量和临时变量,指的是可以出现在赋值表达式右侧的对象。左值引用只能绑定在左值上,右值就会...

漫谈C++——强枚举到底有多强

C++学习笔记

强枚举到底有多“强” 传统枚举类型以及其特性在开发上的弊端已逐渐显露,C++11标准对原有枚举类型进行了加强和补充,从而衍生出了”强枚举”。本文不仅旨在讲清楚强枚举是如何在弱枚举上进行改进,更希望阐明弱枚举的种种不足是如何对开发造成不利影响的;以及同时C++11”新标准”(早已不新)是如何对98的枚举进行补充的。 枚举无处不在 在工程代码当中,只要和数据打交道,基本上就离不开枚举类型—...

算法笔记——单调栈

Leetcode刷题总结 五

单调栈 单调栈 单调栈本身是栈,其存放的数据是有序的,是处理无序数据的一种工具,单调栈也分为单调递增栈和单调递减栈。所谓的增减都是指在栈中存放的元素的大小。对一个无序数据列构造一个若干个有序数据段,则需要使用单调栈。其伪代码如下: stack<int> st; for (遍历这个数组) { if (栈空 || 栈顶元素大于等于当前比较元素) { ...

漫谈C++——顶层和底层const

C++学习笔记

顶层 const 和底层 const 从 const 指针开始说起。 const int* pInt; 和 ` int const pInt = &someInt;,前者是 pInt 不能改变,而后者是 pInt` 不能改变。因此指针本身是不是常量和指针所指向的对象是不是常量就是两个互相独立的问题。用顶层表示指针本身是个常量,底层表示指针所指向的对象是个常量。 更一般的,顶层 c...

刷题笔记——Bitset详解

C++学习笔记

bitset 详解 一些简单的原子操作,往往能组合出复杂而强大的功能,位操作的深远意义不在于表示一种数值,而是可能的情况数。 基本结构 bitset所在的头文件,其命名空间为std,需要注意的是,bitset在使用时bitset属于非类型模板参数。 #include <bitset> using namespace std; bits...