Category: 编程
什么是竞技编程(Competitive Programming)? 竞技编程的英文是 Competitive Programming,是指在限定时间内通过编写程序解决一系列算法问题的比赛形式。比较知名的赛事有 ACM-ICPC、Codeforces、Google Kick Start 等。这类比赛不仅考验选手的算法功底和编程技巧,还需要良好的思维敏捷性和代码调试能力。 比如我二十多年前在高中参加的 ICPC,就是一种典型的竞技编程。当时我们使用的编程语言还是 Turbo Pascal,比赛时间是三个小时,要解决四道题。那时候只要程序能输出正确的结果就行了,根本不太在意代码的实现方式和写得是否优雅。 我家娃在做 LeetCode 的一道算法题时,由于算法不够高效,有两三个测试用例出现了超时。他索性“投机取巧”地加了一个 if 判断,针对那些特定的输入直接返回正确结果。这样做在 LeetCode 上是可行的——前提是你知道测试数据,并能手动处理特殊情况。 但在实际的比赛中,这种做法往往行不通。一方面你无法提前知道测试输入;另一方面题目设计者也会故意防止这种“硬编码逃课”手法,所以比赛更要求通用、稳健的算法方案。这也是竞技编程和普通刷题平台之间的一个重要区别。 🏆 ACM-ICPC(国际大学生程序设计竞赛) 由 ACM 发起,目前由 ICPC Foundation 主办。 …
什么是 C 中的 restrict? restrict 是 C99 引入的指针类型限定符。它告诉编译器,该指针在其生命周期内是访问其所指内存的唯一方式。 这使得编译器可以安全地进行优化,因为它可以假设没有指针别名 —— 即没有其他指针访问相同的内存。 语法示例: void copy(int *restrict dst, const int *restrict src, size_t n); 优点: 启用更激进的编译器优化 提升在循环和内存密集型操作中的性能 明确表达开发者对指针用途的意图 没有使用 restrict 时: …
C++ 左值(lvalue)、右值(rvalue)与右值引用(rvalue reference) 理解 C++ 中的左值、右值及其引用形式,是掌握现代 C++(尤其是 C++11 以后的移动语义/move和完美转发/perfect forwarding)必不可少的基础。 📌 什么是左值(lvalue) 左值指的是有名字、可寻址的对象,通常可以出现在赋值语句的左侧。 int x = 10; x = 20; // x 是左值 int* p = &x; // 可以取地址 …
为什么 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++ 移动语义与 std::move() 教程 C++的std::move用于转移变量/对像的所有权/Ownership。 🔹 什么是移动语义? 在 C++ 中,移动语义通过转移资源所有权/Ownership(如内存或文件句柄)来优化性能,而不是复制它们。 移动语义是在 C++11 中引入的,它允许: 更快速地传递大型或昂贵的对象 更高效地使用临时值 🔹 什么是 std::move()? std::move(x) 并不会真的移动任何东西 —— 它只是将 x 转换为一个 右值引用(即 T&&),告诉编译器: “你可以把这个对象当作临时对象来处理并移动它。” 要真正实现移动,你的类型必须实现 …
C++20 引入了 ranges(范围),这是一个强大且优雅的抽象,用于处理序列(如数组、vector 等)。相比传统的迭代器或旧式循环,Ranges 提高了代码的可读性、可组合性和性能。 什么是 Range? 在 C++20 中,range(范围) 是一种抽象,代表一个可以迭代的元素序列。它与 views(视图) 和 actions(操作) 如过滤、转换等配合使用非常自然。 传统循环 vs 基于 Range 的循环 #include <iostream> #include <vector> int main() { std::vector<int> v …
C++ 智能指针教程 C++ 中的智能指针提供了自动且安全的内存管理。它们通过 RAII(资源获取即初始化)机制,帮助开发者避免内存泄漏和悬空指针的问题,确保对象在生命周期结束时被正确释放。 本教程将介绍 C++ 中三种主要的智能指针: std::unique_ptr:独占式所有权 std::shared_ptr:共享式所有权 std::weak_ptr:非拥有式弱引用 1. std::unique_ptr unique_ptr 拥有独占所有权。一个资源只能被一个 unique_ptr 拥有。 示例:管理简单对象 #include <iostream> #include <memory> int main() { std::unique_ptr<int> p = std::make_unique<int>(42); …