news 2026/4/18 21:20:25

C++学习笔记——数据结构

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C++学习笔记——数据结构

堆和栈的区别:

栈和堆都是⽤于存储程序数据的内存区域。

① 栈是⼀种有限的内存区域,⽤于存储局部变量、函数调⽤信息等。堆是 ⼀种动态分配的内存区域,⽤于存储程序运⾏时动态分配的数据。

② 栈上的变量⽣命周期与其所在函数的执⾏周期相同,⽽堆上的变量⽣命周期由程序员显式控制,可以(使⽤ new 或 malloc)和释放(使⽤ delete 或 free )。

③ 栈上的内存分配和释放是⾃动的,速度较快。⽽堆上的内存分配和释放需要⼿动操作,速度相对较慢。

C++内存分区:

① 栈:存储函数的局部变量、函数参数和函数调⽤信息。函数的调⽤和返回通过栈来管理。

② 堆:存储动态分配的内存,由程序员⼿动分配和释放。使用new、delete或malloc、free来进行堆内存的分配和释放。

③ 全局/静态区: 存储全局变量和静态变量。⽣命周期是整个程序运⾏期间。在程序启动时分配,程序结束时释放。

④ 常量区(只读区):存储常量数据,如字符串常量。

⑤ 代码区:存储程序的代码。

野指针:指向已被释放的或⽆效的内存地址的指针。

使⽤野指针可能导致程序崩溃、数据损坏或其他不可预测的 ⾏为。通常由以下⼏种情况产⽣——

① 释放后没有置空指针

int* ptr = new int; delete ptr; // 此时 ptr 成为野指针,因为它仍然指向已经被释放的内存 ptr = nullptr; // 避免野指针,应该将指针置为 nullptr 或赋予新的有效地址

② 返回局部变量的指针

int* createInt() { int x = 10; return &x; // x 是局部变量,函数结束后 x 被销毁,返回的指针成为野指针 } // 在使⽤返回值时可能引发未定义⾏为

③ 函数参数指针被释放

void foo(int* ptr) { // 操作 ptr delete ptr; } int main() { int* ptr = new int; foo(ptr); // 在 foo 函数中 ptr 被释放,但在 main 函数中仍然可⽤,成为野指针 // 避免:在 foo 函数中不要释放调⽤⽅传递的指针 }

如何避免野指针——

① 释放内存后指针及时置空

② 避免返回局部变量的指针

③ 注意函数参数的生命周期,避免在函数内释放调用方传递的指针,或者通过引用传递指针

④ 使用智能指针 std::unique_ptr

无穷大和无穷小:long long 数据类型

long long x=LONG_MAX; //无穷大 long long y=LONG_MIN; //无穷小

反转函数:reverse

场景代码示例说明
反转整个静态数组std::reverse(arr, arr + size);arr是数组名(首地址),arr + size是尾后指针
反转 vectorstd::reverse(vec.begin(), vec.end());使用begin()end()迭代器
反转 stringstd::reverse(str.begin(), str.end());字符串同样使用迭代器
反转数组的前 k 个元素std::reverse(arr, arr + k);只反转索引[0, k-1]的元素
反转数组的区间 [l, r]std::reverse(arr + l, arr + r + 1);注意:区间是左闭右开,所以末尾要+1
反转 vector 的区间std::reverse(vec.begin() + l, vec.begin() + r + 1);同样遵循左闭右开规则
反转 list(双向链表)std::reverse(lst.begin(), lst.end());list支持双向迭代器
反转普通数组(指针方式)std::reverse(std::begin(arr), std::end(arr));C++11 起推荐,更安全直观

取整函数:三种——ceil()、floor()、round()

函数作用示例(参数 3.2)示例(参数 3.7)示例(参数 -2.3)
ceil()向上取整(往大取整)44-2
floor()向下取整(往小取整)33-3
round()四舍五入34-2

自增运算符:i++++i,它们在返回值性能上有重要区别:

1.i++(后置自增)

先使用当前值,再自增;返回自增之前的值

2. ++i(前置自增)

先自增,再使用新值;返回自增之后的值

int i = 5; int a = i++; // a = 5, i = 6 int b = ++i; // i = 7, b = 7 // 前置自增 ++i 的模拟实现 int& operator++() { // 返回引用 *this += 1; // 先自增 return *this; // 返回自身 } // 后置自增 i++ 的模拟实现 int operator++(int) { // 返回值,int参数用于区分 int temp = *this; // 创建临时变量保存原值 *this += 1; // 自增 return temp; // 返回原值 }

性能:

1. 单独使用时(如for循环的增量部分),两者效果相同

2. 涉及返回值调用时不一定相同(如上述代码所示)

3.++i通常比i++更高效,因为i++需要创建临时对象

static 静态声明:

静态局部变量在第一次函数被调用时创造并初始化,但在函数退出时它不死亡,而是保持其值等待函数下一次被调用。下次调用时不再重新创造和初始化该变量,而是直接用上一次留下的值为基础来进行操作。

void exampleFunction() { static int count = 0; // 静态局部变量 count++; cout << "Count: " << count << endl; } //每次调用函数时输出count值都加一,而不是总输出1
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/18 21:02:57

C++三大隐藏坑:初始化列表、隐式转换、static成员你真的用对了吗?

&#x1f4c5; 2026 C 系列笔记C面向对象构造函数 目录 1. 再探构造函数——初始化列表 哪些成员必须用初始化列表&#xff1f; C11 成员变量缺省值 2. 类型转换与 explicit 3. static 静态成员 1. 再探构造函数——初始化列表 之前写构造函数时&#xff0c;我习惯在函…

作者头像 李华
网站建设 2026/4/18 21:02:29

开发环境管理系统详细设计文档

一、技术背景与需求分析在软件开发行业快速迭代的当下&#xff0c;开发调试环境的标准化、高效化管理已成为制约团队研发效率、产品交付质量的核心因素。随着微服务、云原生、多语言混合开发等技术的普及&#xff0c;开发环境的复杂度呈指数级提升&#xff0c;传统的环境管理方…

作者头像 李华
网站建设 2026/4/18 20:51:07

从DASCTF MAY挑战赛Writeup看Web安全实战与MISC隐写技巧

1. Web安全实战&#xff1a;从Cookie伪造到Apache RCE漏洞利用 最近复盘DASCTF MAY挑战赛的Web题目&#xff0c;发现几个典型漏洞利用场景特别适合新手入门。先说说最简单的Cookie伪造题&#xff0c;题目页面显示"普通用户"&#xff0c;但查看网页源码发现关键提示&a…

作者头像 李华
网站建设 2026/4/18 20:48:55

FlexSim实战:动态合成与优先级返工逻辑的仿真建模

1. 动态合成与优先级返工逻辑的应用场景 想象一下你正在管理一条智能包装生产线。这条生产线需要将三种不同颜色的货物&#xff08;红、绿、蓝&#xff09;按照客户订单要求动态打包到托盘上&#xff0c;然后进行质量检测。检测合格率约为80%&#xff0c;不合格的产品需要优先返…

作者头像 李华
网站建设 2026/4/18 20:44:38

人脸分析系统Face Analysis WebUI快速入门:上传图片秒出结果

人脸分析系统Face Analysis WebUI快速入门&#xff1a;上传图片秒出结果 1. 系统概述&#xff1a;一键获取人脸分析能力 你是否遇到过这些情况&#xff1a; 需要快速分析一张合影中每个人的年龄和性别分布想为产品演示添加实时人脸关键点检测功能研究项目中需要批量处理大量…

作者头像 李华