计算模型:有限自动机 (Finite
Automata)
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878...
进入现代C++, 传统的指针由于容易出现资源泄露等缺点,
智能指针成为了管理资源的重要工具. C++11 中共有四种智能指针:std::auto
_ptr, std::unique_ptr, std::shared_ptr 和 std:
:weak_ptr。所有这些智能指针都是为管理动态分配对象的生命期而设计的,其中,
std::unique_ptr 是一种独占式智能指针,
它确保...
“特种成员函数”指的是那些C++编译器在特定情况下会自动生成的成员函数。在C++11之后,
特种成员函数指的是默认构造函数, 析构函数, 拷贝构造函数, 拷贝赋值运算符,
移动构造函数, 移动赋值运算符。一般来说,
这些函数仅在代码中需要它们,且程序员没有显式声明它们时才会被自动生成。同时,
这些函数的自动生成存在一些机制, 下面我们来详细了解一下。
移动操作的生成规则
编译器仅...
constexpr(Constant Expression,常量表达式)是 C++11
引入的一个至关重要的关键字,它允许我们将计算的执行时机从运行时 (Runtime)
提前到编译时 (Compile Time)。
这不仅仅是一项微小的优化,它从根本上改变了 C++
的编程范式,使得在编译阶段进行复杂的计算和逻辑判断成为可能,从而提高了程序的运行效率并增强了编译期的检查能力。
c...
mutable关键字
mutable(意为“可变的”)是一个存储说明符关键字,它的唯一目的就是“突破
const 限制”。
我们知道,一个被 const 修饰的成员函数(例如 void myFunction()
const;)向调用者承诺:“这个函数不会修改对象的任何成员变量。”. 然而, 因为
mutable 用于修饰类的非静态数据成员, 一旦一个成员变量被声明为
mutabl...
正如标题所指出的, noexcept
是一个关键的函数接口规范,它能带来显著的编译器优化,并对移动语义的实现至关重要。
在 C++11 之前,C++98 提供了异常规格(如 throw(SomeException) 或
throw()),但这套机制要求开发者列出函数可能抛出的所有异常类型,这在实践中难以维护,且编译器通常不会严格检查其一致性,导致该特性最终被普遍弃用。实际上,
开...
计算理论是计算机科学的基石,它试图从根本上回答三个关于“计算”这一过程的终极问题:
能做什么?什么是算法?(可计算性, 不可判定性)
用什么模型来做?(自动机与模型)
能多快/多好地做?(复杂性)(本课程未涉及)
这门学科本质上是数学的一个分支,它使用严谨的、抽象的数学模型来探索计算的本质、能力和极限
该课程安排在大三秋冬学期, 参考课本为《Elements of the ...
集合 (Sets)
基本定义与性质
集合 (Set):一个无序的元素集合 (An unordered collection of elements)
。
空集 (Empty set):记作 Ø 。
子集
(Subset):表示一个集合是否被另一个集合所包含。其严格定义为:S⊆T⇔(∀x∈S⇒x∈T)。任何集合都是其自身的子集
。
集合相等 (Equal
Sets):两个集合...
C++98
风格的枚举(现在称为不限作用域的枚举型别)存在两个主要缺陷。C++11
引入的限定作用域的枚举型别(也称“枚举类”)则直接解决了这两个问题。
了解枚举
在 C++ 中,枚举 (Enumeration, 简称 enum)
是一种用户自定义的数据类型,它允许我们为一组相关的整型常量赋予具有描述性的名称。
使用枚举的主要目的是增强代码的可读性和类型安全,避免在代码中直接使用...
在 C++ 中,typedef 和 C++11 引入的“别名声明”(Alias
Declaration)都用于创建类型同义词。例如,以下两行代码在功能上是完全等效的:
12345// C++98 的做法typedef std::unique_ptr<std::unordered_map<std::string, std::string>> UPtrMapSS; [...