Cpp学习22 迭代器与算法, 动态内存分配(原教程未完成)
选择排序
#include <algorithm>
std::sort 请。
iterators 迭代器
迭代器是一个用于遍历容器(例如数组中的值或字符串中的字符)的对象,它提供了对沿途每个元素的访问。
最简单的迭代器是指针,它(使用指针运算)适用于内存中顺序存储的数据。
迭代是一种非常常见的操作,所有标准库容器都直接支持迭代。我们无需自己计算起点和终点,只需通过名为 begin() 和 end() 的成员函数向容器请求起点和终点即可
1 |
|
对于迭代器,通常使用 operator!= 来测试迭代器是否已到达最后一个元素(某些迭代器类型不支持关系比较)
在底层,基于范围的 for 循环会调用要遍历的类型的 begin() 和 end() 函数。
与指针和引用类似,如果迭代器中被迭代的元素地址发生变化或被销毁,迭代器就会变成“悬空”状态。这种情况发生时,我们称迭代器已失效 。访问失效的迭代器会导致未定义行为。
标准库算法
用时查。而且现在有LLM,可以令其推荐std算法。
代码计时
chrono 库。
but IDE 自带性能分析。
动态内存分配 new、delete
C++ 支持三种基本类型的内存分配,其中你已经见过两种了。
- 静态内存分配用于静态变量和全局变量。这类变量的内存会在程序运行时分配一次,并在程序的整个生命周期内保持不变。
- 函数参数和局部变量的内存分配是自动进行的。当进入相关代码块时,会为这些变量分配内存;当退出代码块时,会释放内存,如此反复多次,直至达到所需效果。
- 本文的主题是动态内存分配 。
动态内存分配是指程序在需要时向操作系统请求内存的一种方式。这些内存并非来自程序有限的栈内存,而是从操作系统管理的更大的内存池(称为堆) 中分配的。在现代计算机上,堆的大小可以达到数 GB。
1 | int* ptr{ new int }; |
1 | int* ptr1{ new int (5) }; // use direct initialization |
当我们不再使用动态分配的变量时,需要显式地告诉 C++ 释放内存以供重用。对于单个变量,这可以通过标量(非数组)形式的 delete 运算符来实现:
1 | // assume ptr has previously been allocated with operator new |
指向已释放内存的指针称为悬空指针 。解引用或删除悬空指针会导致未定义行为。
除非被删除的指针紧接着超出作用域,否则应将其设置为 nullptr。
如果 new 分配内存失败,它将返回一个空指针,而不是已分配内存的地址。
当程序在将动态分配的内存地址交还给操作系统之前丢失该内存地址时,就会发生内存泄漏。发生这种情况时,程序无法删除这部分动态分配的内存,因为它不再知道它的位置。操作系统也无法使用这部分内存,因为它被认为仍在被程序使用。
动态分配数组
动态分配 C 风格的数组,这是最常见的动态分配数组类型。略。不如 std::vector。
RAII 原则
RAII (Resource Acquisition Is Initialization) 资源获取即初始化 (RAII) 是一种编程技术,
一个实现了 RAII 原则的类示例——在构造函数中分配内存,在析构函数中释放内存。
指向指针的指针和动态多维数组
C 风格的动态多维数组会用到多维指针。…谁用啊。
void 指针
void 指针 ,也称为通用指针,是一种特殊的指针,它可以指向任何数据类型的对象!
1 | void* ptr {}; // ptr is a void pointer |
不能直接解引用。必须先转成相应指针类型再解引用。
还不能直接删除,也不能直接进行指针运算。
鸡肋的东西。
- 标题: Cpp学习22 迭代器与算法, 动态内存分配(原教程未完成)
- 作者: 铁名_IronName
- 创建于 : 2026-08-13 17:07:20
- 更新于 : 2026-08-14 09:53:11
- 链接: https://blog.ironname.top/2026/Cpp/Cpp学习22/
- 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。