Tag: 学习笔记

C++: auto_ptr智能指针被弃用

为什么 auto_ptr 在 C++ 中被弃用 TLDR; 很久之前看到auto_ptr就觉得挺好,和auto一样,反正不用自己管,C++会自动推导智能指针的类型。不过这个关键字已经在C++ 11中被弃用/deprecated。 弃用与移除 std::auto_ptr 在 C++ 11 中被弃用。 在 C++ 17 中被完全移除。 为什么 auto_ptr 被弃用? 它具有不安全的拷贝语义/copy semantics。 拷贝一个 auto_ptr 会转移所有权,并将原指针设为 nullptr。 这种行为很容易引发 bug,尤其是在标准容器或算法中使用时。 …

C++中的consteval是什么? 它与const和constexpr有何不同?

C++:什么是 consteval?它与 const 和 constexpr 有何不同? 如果你在 C++ 中经常使用 const 和 constexpr,可能会好奇 C++20 新引入的 consteval 关键字到底是做什么用的。下面我们来一一解析。 什么是 consteval? consteval 用于声明一个立即函数(immediate function),也就是说,这个函数必须在编译期进行求值。与 constexpr 不同,constexpr 允许函数在编译期或运行期执行,而 consteval 强制要求只能在编译期调用。 consteval int square(int …

C++ 教程: 用std::move来移动所有权

📘 C++ 移动语义与 std::move() 教程 C++的std::move用于转移变量/对像的所有权/Ownership。 🔹 什么是移动语义? 在 C++ 中,移动语义通过转移资源所有权/Ownership(如内存或文件句柄)来优化性能,而不是复制它们。 移动语义是在 C++11 中引入的,它允许: 更快速地传递大型或昂贵的对象 更高效地使用临时值 🔹 什么是 std::move()? std::move(x) 并不会真的移动任何东西 —— 它只是将 x 转换为一个 右值引用(即 T&&),告诉编译器: “你可以把这个对象当作临时对象来处理并移动它。” 要真正实现移动,你的类型必须实现 …

Python 中寻找数据的众数: mode vs multimode

在 Python 中寻找数据的众数 statistics.mode() 函数是 Python 中 statistics 模块的一部分,它返回数据集中出现次数最多的单个值(众数)。与 multimode() 不同,mode() 如果数据集包含多个众数(即多模态数据)或数据为空,则会引发错误。 以下是一些示例来说明 mode() 的行为: mode() 的语法 statistics.mode(data) data: 一个序列(例如 list、tuple),其中的元素是可散列的,用于确定众数。 示例 单一众数(单模态数据) from statistics import mode data = …

迭代幂运算/重幂的介绍与其Python代码实现

数学中的迭代幂运算/重幂是什么? 迭代幂运算(重幂)是数学中的一种运算,涉及到反复进行幂次运算。它是超运算序列的一部分,该序列延伸了加法、乘法和幂运算。在迭代幂运算中,一个数自乘多次,直到达到指定的次数。 一个数a迭代幂的高度n通常表示为:,也就是把n写在a的左上角,(也可以记作:a↑↑n)这表示a被迭代n次。 例如: (简单恒等式) (a自乘一次) (a的幂次为a自乘) ,依此类推。 在迭代幂运算的上下文中, 通常未定义或没有普遍共识。然而,一些数学惯例建议对于任何 ,,类似于在幂运算中对任何非零的 有 的情况。 迭代幂运算示例 让我们评估 (读作“2迭代到高度3”): 因此 迭代幂/重幂运算的通用性质 非交换性:迭代幂运算不是交换的,这意味着 增长速度非常快:迭代幂运算增长非常快。即使是小数也会因为幂运算的快速增长而导致非常大的结果。 迭代幂运算/重幂在基础数学中较少见,但在某些高级数学领域中发挥作用,特别是在涉及极大数的领域,如大数理论和计算机科学中。 用 Python 计算迭代幂运算 以下是两个计算迭代幂运算的Python函数。第一个使用递归,第二个使用迭代。 在两个函数中,我们在开始时添加了对 n = 0 …

软件工程师面试: TCP/IP协议是什么?

最近,在面试第一轮抖音(字节跳动)的伦敦职位(Site Reliability Engineer),被问到了这个问题:TCP/IP协议是什么?这个是考基本功,是每个软件工程师都要会的。 TCP/IP(传输控制协议/互联网协议)是一组网络协议,管理数据如何通过互联网和其他网络传输。它是互联网的基本通信模型,由两个主要层组成: 互联网协议 (IP) IP 负责将数据包从源地址路由到目标地址。它工作在 OSI 模型的网络层。 IP 地址:互联网中的每个设备都被分配了一个唯一的 IP 地址,用于标识数据包的发送者和接收者。 数据包路由:IP 将数据分成多个包,并通过不同的网络将其路由到目标地址。 版本:IP 主要有两个版本:IPv4(32位地址)和 IPv6(128位地址)。 传输控制协议 (TCP) TCP 负责确保设备之间数据传输的可靠性。它工作在 OSI 模型的传输层。 面向连接:TCP 在传输数据之前会在发送方和接收方之间建立连接。 数据完整性:TCP 通过确认、序列号和错误检查等机制,确保数据包按顺序无误地到达。 …

C/C++ 中的内存管理器(堆与栈)

最近面试的时候遇到这个问题。这个问题考你计算机的基本功。 在 C/C++ 中,内存管理是控制程序如何分配和管理其资源的关键方面。C/C++ 程序中的内存通常分为不同的区域:堆栈和堆是最主要的动态和自动内存分配区域。 ACM题解系列之 – 最小堆栈 (Min Stack) 堆栈内存 定义:堆栈内存用于静态(自动)内存分配。它是存储函数参数、本地变量和返回地址的地方。当调用一个函数时,一个新的内存块(称为堆栈帧)会被添加到堆栈的顶部。当函数返回时,该内存会被自动释放。 分配:内存由系统自动管理——在变量超出作用域时自动分配和释放。无需人工干预。 生命周期:受限于函数或代码块的作用域。一旦函数退出,内存将被释放。 大小限制:堆栈的大小通常较小并由系统预定义,意味着大的分配可能导致堆栈溢出。 访问速度:由于其后进先出(LIFO)的结构,堆栈内存访问速度更快。由于内存是连续的且可预测的,它允许快速访问。 使用场景:局部变量、函数调用信息和固定大小的对象(数组、结构体)。 堆内存 定义:堆内存用于动态内存分配,程序员使用 C 中的 malloc()、calloc()、free() 和 C++ 中的 new、delete 手动分配和释放内存。 分配:内存在运行时分配,并且分配的生命周期由程序员手动控制。它可以持续存在,直到显式释放。 生命周期:堆分配的对象的生命周期不受作用域的限制。内存将一直被使用,直到被释放为止。 …