C++ STL迭代器失效场景大盘点(仅限资深工程师知晓的细节)

第一章:C++ STL迭代器失效场景概述

在C++标准模板库(STL)中,迭代器是访问容器元素的核心机制。然而,在对容器进行修改操作时,某些操作可能导致已获取的迭代器失效,进而引发未定义行为。理解迭代器失效的场景对于编写安全、高效的C++代码至关重要。

常见导致迭代器失效的操作

  • 插入或删除元素:在vector中插入元素可能导致内存重新分配,使所有迭代器失效
  • 容器扩容:如vector的push_back触发resize时,原有迭代器不再有效
  • erase调用后:list的erase会使被删除元素对应的迭代器失效,但其他迭代器仍有效

不同容器的迭代器失效特性对比

容器类型插入是否导致失效删除是否导致失效
vector是(可能全部失效)是(当前位置及之后)
list否仅删除位置失效
deque是(两端插入除外)是(影响多个位置)

代码示例:vector迭代器失效演示

// 示例:vector插入导致迭代器失效
#include <vector>
#include <iostream>

int main() {
    std::vector<int> vec = {1, 2, 3};
    auto it = vec.begin();
    
    vec.push_back(4); // 可能触发重新分配,导致it失效
    
    // 错误:使用已失效的迭代器
    // std::cout << *it << std::endl; // 未定义行为
    
    it = vec.begin(); // 正确做法:重新获取迭代器
    std::cout << *it << std::endl; // 输出1
    return 0;
}
上述代码展示了在vector扩容后继续使用旧迭代器的风险,强调了操作后重新获取迭代器的重要性。

第二章:序列式容器中的迭代器失效

2.1 vector插入与扩容引发的迭代器失效问题

在C++标准库中,std::vector的动态扩容机制可能导致迭代器失效。当插入元素导致容量不足时,vector会重新分配内存并复制或移动原有元素,原有迭代器指向的内存已无效。
常见失效场景
  • 尾部插入触发扩容:所有迭代器失效
  • 中间插入:插入点及之后的迭代器失效
  • 使用push_back后仍引用旧迭代器将导致未定义行为
代码示例

#include <vector>
#include <iostream>
int main() {
    std::vector<int> v = {1, 2, 3};
    auto it = v.begin();
    v.push_back(4); // 可能触发扩容
    std::cout << *it; // 危险:it可能已失效
}
上述代码中,若push_back引发扩容,it将指向被释放的内存,解引用导致未定义行为。建议在插入后重新获取迭代器。

2.2 deque在首尾操作时的迭代器稳定性分析

在C++标准库中,`std::deque`(双端队列)支持在首尾高效插入和删除元素。与`std::vector`不同,`deque`在尾部或头部插入元素时,通常不会使指向其他元素的迭代器失效。
迭代器失效规则
  • 在尾部插入(push_back):仅可能使尾后迭代器(end())失效
  • 在头部插入(push_front):不影响其他有效迭代器
  • 删除操作:仅使指向被删除元素的迭代器失效
代码示例

std::deque<int> dq = {1, 2, 3};
auto it = dq.begin(); // 指向1
dq.push_front(0);     // 插入头部
std::cout << *it;     // 仍合法,输出1
上述代码中,尽管在头部插入新元素,原有迭代器it仍指向原位置,体现了deque对非目标位置迭代器的保护机制。

2.3 list容器中特殊操作对迭代器的影响

在C++的STL中,std::list是一种双向链表容器,其内存不连续。这一特性决定了某些操作不会使迭代器失效,而部分特殊操作仍需谨慎对待。
保持有效的操作
以下操作不会导致迭代器失效:
  • push_front() 和 push_back()
  • insert() 插入新元素
  • erase() 仅使指向被删除元素的迭代器失效
std::list<int> lst = {1, 2, 3};
auto it = lst.begin();
lst.push_front(0); // it 仍然有效,指向原第一个元素
std::cout << *it; // 输出:1
上述代码中,尽管在头部插入元素,原有迭代器it仍指向原来的节点,因其底层节点地址未改变。
迭代器失效场景
唯一导致迭代器失效的操作是删除对应元素:
auto it = lst.find(2);
lst.erase(it); // it 现在失效,不可再解引用
此时必须重新获取迭代器,否则行为未定义。

2.4 forward_list的单向链区特性与迭代器有效性

单向链表结构特点
forward_list 是 C++ STL 中实现的单向链表容器,仅支持向前遍历。其节点包含数据值和指向下一节点的指针,内存开销小,插入删除效率高。
  • 不支持随机访问,只能通过递增操作遍历
  • 相比 list,空间更紧凑,每个节点少一个指针
迭代器有效性分析
在插入或删除元素时,forward_list 的迭代器行为具有特定规则:
操作迭代器影响
insert_after不影响其他迭代器
erase_after仅失效被删除节点的迭代器

std::forward_list flist = {1, 2, 3};
auto it = flist.begin();
flist.insert_after(it, 4); // it 仍有效
上述代码中,insert_after 在指定位置后插入新元素,原迭代器 it 保持有效,符合单向链表的局部修改特性。

2.5 array作为固定大小容器的迭代器安全保证

在C++中,std::array作为固定大小的序列容器,提供了强迭代器安全保证。由于其底层内存是连续且静态分配的,任何修改操作均不会导致容器重新分配内存,从而确保所有迭代器在整个生命周期内保持有效。
迭代器失效场景分析
  • std::array不支持动态插入或删除元素,因此不存在因扩容导致的迭代器失效
  • 唯一可能使迭代器失效的操作是容器本身的析构
  • 赋值、交换(swap)等操作会复制元素,但源和目标容器的迭代器仍指向各自的合法位置
代码示例与说明

#include <array>
#include <iostream>

int main() {
    std::array<int, 3> arr = {1, 2, 3};
    auto it = arr.begin(); // 获取起始迭代器
    arr[0] = 42;           // 修改元素不影响迭代器有效性
    std::cout << *it;      // 安全:输出 42
    return 0;
}
上述代码中,尽管修改了首个元素,但迭代器it始终有效。这是因为std::array的存储空间在编译期确定,运行时无任何重排行为。

第三章:关联式容器的迭代器失效规律

3.1 set和multiset插入删除操作的迭代器影响

在C++标准库中,`set`和`multiset`基于红黑树实现,其插入和删除操作对迭代器的稳定性有特定影响。
插入操作的迭代器行为
插入元素不会使已有迭代器失效。无论是`insert()`还是`emplace()`,原有指向其他元素的迭代器依然有效。

std::set<int> s = {1, 2, 4};
auto it = s.begin();
s.insert(3); // it 仍然有效,指向 1
上述代码中,插入新元素后,原迭代器 `it` 仍可安全使用。
删除操作的迭代器行为
删除仅使指向被删元素的迭代器失效,其余不受影响。
  • 使用 erase(it) 后,it 失效
  • 其他迭代器保持有效性
因此,在遍历中删除元素时应使用返回值获取下一个有效位置:

for (auto it = s.begin(); it != s.end(); )
    it = s.erase(it); // erase 返回下一个有效迭代器

3.2 map与unordered_map在元素变动中的迭代器行为

在C++标准库中,map和unordered_map对元素插入或删除时的迭代器有效性有着显著差异。
map的迭代器稳定性
map基于红黑树实现,插入或删除元素仅影响被操作元素对应的迭代器,其余迭代器保持有效。

std::map<int, std::string> m = {{1, "a"}, {2, "b"}};
auto it = m.begin();
m.insert({3, "c"}); // it 仍然有效
上述代码中,插入新元素后,原有迭代器it仍指向第一个元素,不会失效。
unordered_map的重新哈希风险
unordered_map使用哈希表,插入可能导致桶数组扩容,触发rehash,使所有迭代器失效。

std::unordered_map<int, std::string> um;
auto it = um.begin();
um.insert({1, "x"});
// 若发生 rehash,it 将失效,不可再解引用
容器插入后迭代器有效性删除非目标元素后
map全部有效(除被删元素)保持有效
unordered_map可能全部失效仅被删元素失效
因此,在频繁变动的场景中需谨慎管理迭代器生命周期。

3.3 哈希容器rehash机制导致的批量迭代器失效

在哈希容器进行 rehash 操作时,底层桶数组会被重新分配,所有元素将根据新的哈希分布迁移至新桶中。这一过程会导致原有迭代器所持有的节点指针失效。
迭代器失效场景
当插入或删除操作触发 rehash 时,正在遍历容器的迭代器可能指向已被释放或移动的内存位置,从而引发未定义行为。
  • 标准库 unordered_map 在 rehash 时会完全重建哈希表
  • 所有已获取的迭代器均不再有效
  • 仅保留容器引用的操作仍安全

std::unordered_map data;
auto it = data.begin();
data.rehash(64); // 触发rehash
// it 已失效,解引用将导致未定义行为
上述代码中,rehash 调用后,it 指向的内存已被重新组织,继续使用将引发程序崩溃。因此,在可能触发 rehash 的操作后,应重新获取迭代器。

第四章:特殊操作与算法引发的隐性失效

4.1 erase-remove惯用法在不同容器中的迭代器处理

在C++标准库中,erase-remove惯用法是删除容器中满足特定条件元素的高效方式。其核心思想是先通过std::remove或std::remove_if将需保留元素前移,并返回逻辑上的新尾部迭代器,再调用容器的erase方法真正释放尾部无效元素。

基本使用示例
std::vector vec = {1, 2, 3, 2, 4, 2};
vec.erase(std::remove(vec.begin(), vec.end(), 2), vec.end());

上述代码将所有值为2的元素“移除”,实际过程分为两步:`std::remove`重排元素并返回新尾部,`erase`清除无效尾部,避免了逐个删除带来的性能开销。

容器差异与迭代器失效
  • 序列容器(如vector、deque):支持随机访问迭代器,erase-remove高效且安全;
  • 关联容器(如set、map):不适用该惯用法,因其元素有序且不允许随意重排,应直接使用成员函数erase。

4.2 容器适配器底层存储变更对迭代器的间接影响

容器适配器如 std::stack 和 std::queue 并不提供传统意义上的迭代器,因其接口被设计为受限访问。然而,当这些适配器基于支持迭代器的底层容器(如 std::vector、std::deque)实现时,底层存储的变更会间接影响通过其他方式访问数据的行为。
底层容器的动态扩容
以 std::deque 为例,其分段连续存储机制在插入过程中可能导致部分内存块重排:

std::deque dq = {1, 2, 3};
const int* ptr = &dq[0];
dq.push_front(0); // 可能导致原有地址失效
// 此时 ptr 指向的内存可能已无效
上述代码中,push_front 操作可能触发内部缓冲区重新分配,使原有指针或引用失效,进而影响依赖该地址的外部遍历逻辑。
适配器封装下的隐式风险
  • 虽然适配器本身无迭代器,但若用户缓存底层容器的指针或引用,存储重排将导致悬空指针;
  • 使用 std::priority_queue 时,堆结构的调整不会暴露迭代器,但直接访问容器适配器所封装的容器(如通过友元或反射)存在类似风险。

4.3 使用STL算法时未察觉的迭代器失效陷阱

在C++ STL中,容器操作可能导致迭代器失效,若未及时察觉,极易引发未定义行为。尤其在结合STL算法使用时,问题更加隐蔽。
常见失效场景
  • std::vector 在扩容时会使所有迭代器失效
  • std::list::splice 可能使源容器的迭代器失效
  • 删除元素后继续使用指向已删元素的迭代器
代码示例与分析

std::vector vec = {1, 2, 3, 4};
auto it = std::find(vec.begin(), vec.end(), 3);
vec.push_back(5); // 可能导致迭代器失效
*it = 10;         // 危险!迭代器可能已失效
上述代码中,push_back 可能触发重新分配内存,使 it 指向已被释放的空间,后续解引用将导致未定义行为。
安全实践建议
容器类型操作迭代器影响
vectorinsert全部失效(若重分配)
listerase仅指向被删元素的失效

4.4 多线程环境下并发修改导致的迭代器未定义行为

在多线程程序中,当多个线程同时访问和修改共享容器时,若一个线程正在通过迭代器遍历容器,而另一个线程对容器进行了增删操作,将可能导致迭代器失效,引发未定义行为。
典型问题场景
以下 Go 语言示例展示了并发修改的风险:

var m = make(map[int]int)
go func() {
    for i := 0; i < 100; i++ {
        m[i] = i
    }
}()
go func() {
    for range m { // 并发读写导致 panic
    }
}()
上述代码在运行时极有可能触发 fatal error: concurrent map iteration and map write。因为 Go 的 map 不是线程安全的,迭代过程中若有写入,底层会检测到并主动中断程序。
解决方案对比
方案说明适用场景
互斥锁(Mutex)读写均加锁,保证串行访问高频写操作
RWMutex读操作可并发,写独占读多写少

第五章:规避策略与最佳实践总结

实施最小权限原则
在系统设计中,应严格遵循最小权限模型。例如,在 Kubernetes 集群中为 Pod 分配 ServiceAccount 时,仅授予其完成任务所需的最低 API 权限:
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: production
  name: limited-reader
rules:
- apiGroups: [""]
  resources: ["pods"]
  verbs: ["get", "list"]
定期进行安全审计与配置扫描
使用自动化工具如 Trivy 或 kube-bench 定期检测部署配置中的安全偏差。建议将扫描集成到 CI/CD 流水线中,防止高风险配置进入生产环境。
  • 每周执行一次全面的依赖漏洞扫描
  • 每次提交代码前运行静态配置检查
  • 记录并跟踪所有发现的违规项直至闭环
建立健壮的监控与告警机制
关键服务必须配置多维度监控指标。以下为典型微服务应监控的核心项:
监控维度指标示例告警阈值
请求延迟P99 延迟 > 1.5s持续 5 分钟触发
错误率HTTP 5xx 占比 > 5%3 分钟内累计触发
资源使用CPU 使用率 > 85%持续 10 分钟告警
采用自动化回滚策略
在发布过程中启用基于健康检查的自动回滚。例如,在 Argo Rollouts 中定义分析模板,当 Prometheus 检测到错误率突增时自动触发回退:
strategy:
  canary:
    steps:
    - setWeight: 20
    - pause: {duration: 300}
    - setWeight: 100
    analysis:
      templates:
      - templateName: error-rate-check
      args:
      - name: service-name
        value: user-api
YOLOv8作物病害检测实战源码 这是一套基于YOLOv8n的农田病虫害目标检测系统,对叶片照片做目标检测,识别健康叶片、褐斑病、白粉病、锈病四类,并给出对应防治建议。全流程纯CPU可跑,配套交付完整Python源码、9章实战教程(md/html/pdf三种格式)、100张自造样本及YOLO标签、训练曲线与混淆矩阵截图、Tkinter界面和答辩PPT。 系统围绕五项功能展开:同一套推理逻辑覆盖图像、视频、摄像头三种来源;图形界面选文件即检测,画面叠彩色框标注病名与置信度,右侧面板同步给出症状与防治措施;检测记录自动写入CSV,统计页一键生成四类病害占比饼图;训练结束自动产出损失与精度曲线;内置防治建议文案库,检测命中即回填面板。 选型用YOLOv8n nano档,参数量约320万、权重约6.2MB,CPU单帧几十毫秒,小样本训练5到8分钟完成。数据由data_gen.py程序化绘制100张叶片图,固定随机种子,重跑分布一致,不依赖公开数据集。依赖全部锁版本,教程第7章整理了19条真实报错及排查方法,第8章给出换模型档、换PlantVillage数据集的迁移路径。 适合做计算机视觉方向课程设计或毕业设计的学生,也适合智慧农业方向想了解检测模型如何落进业务面板的学习者。不需要GPU,不需要系统学过目标检测,教程第3章会按需补齐原理。 使用时先pip install -r requirements.txt装好依赖,download_data.py下载预训练权重,data_gen.py生成样本后train.py训练,完成后用main.py infer批量检测或main.py gui启动界面。 立即下载

相关推荐

数据挖掘实战:决策树 + 聚类 + 关联规则,零 Key 离线可跑(Python 源码)

数据挖掘实战包。用 Python 标准库实现 CART 风格决策树、K-Means 聚类与 Apriori 关联规则,在虚构「星河便利店」会员表和购物篮上跑通分类、分群与购物篮分析,并给出准确率、轮廓系数、支持度/置信度/提升度。零第三方依赖、零 API Key 即可离线跑通。含 4 个样例、离线冒烟、中文 README(含「使用方法」)。均为作者原创可运行源码。MIT。作者 blog.youkuaiyun.com/mtl1994

迭代器失效场景

vector迭代器失效情况: 所谓的动态增加大小,并不是在原空间之后接续空间(因为无法保证原空间之后尚有可供配置的空间),而是以原大小两倍另外配置一块较大的空间,然后将原内容拷贝过来,然后才开始在原内容之后构造新元素,并释放原空间。 因此,对vector的任何操作,一旦引起空间重新分配,指向原vector的所有迭代器就都失效了。这就是为什么《C++ Primer》中说push_ba

蓝旭晨枫╮ 851

科技中介服务机构在技术供需对接中如何实现服务流程的自动化与标准化?.docx

科技中介服务机构在技术供需对接中如何实现服务流程的自动化与标准化?

C++ STL 迭代器失效问题

本文有更新,请移步我的个人博客:https://blog.andyqiao.top/article/17/    之前看《C++ Primier》的时候,也解到在顺序型窗口里insert/erase会涉及到迭代器失效的问题,并没有深究。今天写程序的时候遇到了这个问题。 1 莫名其妙的Erase     最初我的程序是酱紫的,别说话,我知道这样是有问题的,可这样是最直观的想法 i...

weixin_30341745的博客 358

产业园区如何高效对接企业技术需求与高校科研成果?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

国央企创新负责人如何快速掌握本地科技资源分布与匹配情况?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

C++迭代器失效场景

一、序列式容器(数组式容器) 对于序列式容器(如vector,deque),序列式容器就是数组式容器,删除当前的iterator会使后面所有元素的iterator都失效。 erase方法可以返回下一个有效的iterator。 for (iter = cont.begin(); iter != cont.end();) { (*it)->doSomething(); if (shouldDelete(*iter)) iter = cont.erase(iter); //e...

s651665496的专栏 960

国央企创新负责人如何实现科技成果的精准识别与高效筛选?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

迭代器失效的场景

vector迭代器的失效的情况: 1.当插入(push_back)一个元素后,end操作返回的迭代器肯定失效。 2.当插入(push_back)一个元素后,capacity返回值与没有插入元素之前相比有改变,则需要重新加载整个容器,此时first和end操作返回的迭代器都会失效。 3.当进行删除操作(erase,pop_back)后,指向删除点的迭代器全部失效;指向删除点后面的元素的迭代器也将

f905699146的博客 928

高校技术转移办公室人员如何系统化管理科技成果信息?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

科技中介服务机构如何构建标准化、模块化的智能服务工具?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

迭代器失效的几种情况

关于迭代器失效,,今天做一个总结。 迭代器失效分三种情况考虑,也是三种数据结构考虑,分别为数组型,链表型,树型数据结构。 1、对于序列式容器,比如vector,删除当前的iterator会使后面所有元素的iterator都失效。 举例如下: void vectorTest() { vector&lt;int&gt; v; for (int i = 0; i &lt; 10;...

honeyJ 5245

fab-pm-optimizer-python-entry-py39-20261021-v1-1-0

fab-pm-optimizer-python-entry-py39-20261021-v1-1-0

C++ deque::erase() 函数深度解析:安全删除与迭代器失效陷阱

在C++标准库中,容器操作是构建高效程序的基础。以双端队列(deque)为例,它结合了vector的随机访问和list的头尾操作优势,其底层通常由多个固定大小的内存块组成。当执行删除操作时,特别是erase()函数,会引发元素移动和内存布局调整,这直接关系到迭代器、指针和引用的有效性——即“迭代器失效”问题。理解这一原理对于编写健壮代码至关重要,它能避免程序崩溃或未定义行为。从技术价值看,掌握安全的删除模式(如利用erase返回值更新迭代器)和高效惯用法(如erase-remove),能显著提升程序稳定性和

weixin_33937913的博客 422

注册“Oracle Provider for OLE DB”和创建链接服务器

注册“Oracle Provider for OLE DB”和创建链接服务器 在sql server 数据库上创建链接服务器,连接oracle数据库,访问接口需要设置为:“Oracle Provider for OLE DB”。 如果电脑上没有这个驱动,安装一个完整的Oracle11gR2程序是一个有效的方法,但这个64位版本的安装包有2个多G, 相当庞大,如果仅仅...

weixin_30760895的博客 2384

Visual SLAM算法笔记

最近在学习SLAM算法,这里作为阅读笔记记录和总结一下。对经典的单目SLAM/VO算法做了摘要和总结,比如Nister VO、MonoSLAM、PTAM、ORB-SLAM、LSD-SLAM、SVO、DSO等,对几个单目和IMU的融合算法也做了简单总结,比如MSCKF、OKVIS、IMU-Preintegration等。

MulinB的技术博客 3万+

C++模板本质:编译期类型工厂与零开销抽象机制

C++模板是一种在编译期生成特化代码的泛型编程机制,不同于Java泛型的类型擦除,它通过模板实例化为每种实际类型生成独立、高效的目标代码。其核心原理涵盖参数推导、SFINAE约束、重载决议与依赖类型解析,技术价值在于实现零运行时开销、极致性能与强类型安全。典型应用场景包括标准容器(如vector)、算法(如std::sort)及现代可选类型(optional)。本文深入剖析函数模板、类模板、变参模板及Concepts演进,聚焦c++函数模版实现细节与c++八大排序算法背后的模板工程实践。

weixin_30855099的博客 377

Java对接快递鸟,查询快递物流信息

根据用户输入的订单号,我们的后台识别订单号并根据快递鸟查询快递API接口,实现自动查询的功能。下面是java版本的根据单号查询物流跟踪信息的详细示例代码。只需要下载就可以运行,(自己需要简单的修改)注:登录快递鸟用户管理后台后获得。登录快递鸟用户管理后台。

Roc的博客 958

C#特性滥用风险与工程化精简实践

编程语言的抽象能力是双刃剑——它提升开发效率,也隐匿运行时复杂性。当C#引入dynamic、LINQ、Source Generator等高级特性时,其背后涉及的表达式树编译、状态机生成、编译期代码膨胀等机制,正悄然抬高调试成本与认知门槛。这类抽象泄漏现象,在金融、IoT、医疗等强稳定性场景中尤为致命:编译耗时飙升、GC暂停不可控、新人上手周期延长。本文基于真实项目数据,剖析C# 9~12关键特性的工程熵增表现,并提出以编译期守门(Roslyn Analyzer)、运行时监控(DiagnosticSource

didi9310的博客 391

SAP使用XCO框架创建RAP所有对象

通过XCO框架自动生成SAP ABAP开发对象。

DeveloperMrMeng的博客 550

基于JeecgBoot 3.9.0 开源项目的企业管理平台

基于JeecgBoot 3.9.0 开源项目的企业管理平台

宁波阿成的博客 374

C++迭代器失效的几种情况

C++迭代器失效的几种情况

lizfs_csdn的博客 1557

YOLO格式数据集划分

YOLO格式的数据集划分 标题标签格式txt import os import cv2 import random from PIL import Image # os.makedirs('labels_train') # os.makedirs('labels_val') img_train_path ='./img_train/' #图片训练集保存路径 img_val_path = './img_val/' #图片验证集保存路径 labels_train_path = './labels_t

weixin_51154380的博客 3308

【C++】vector迭代器失效场景

vector 内部数据结构:数组。 随机访问每个元素,所需要的时间为常量。 在末尾增加或删除元素所需时间与元素数目无关,在中间或开头增加或删除元素所需时间随元素数目呈线性变化。 可动态增加或减少元素,内存管理自动完成,但程序员可以使用reserve()成员函数来管理内存。 vector的迭代器在内存重新分配时将失效(它所指向的元素在该操作的前后不再相同)。当把超过capacity()-size(...

ZD_012的博客 385

计算机应用数学--第一次作业

中科大 计算机应用数学 第一次作业

一杯水果茶!足矣~ 1329

STM32_HAL库—PWM产生指定个数

(一)CubeMX设置: 1. 晶振配置(72M) 2. 引脚配置 3. 中断配置 4. 配置及实现方式 由上推出公式: 机器周期: (72MHz / 36) = 2MHz = 0.5us PWM周期: 0.5 * 100 = 50us = 20kHz 5. 主函数调用PWM函数 HAL_TIM_PWM_Start_IT(&htim3, TIM_CHANNEL_2); //此处一句后可直接进入中断 6. PWM溢出回调函数 void HAL_TIM_PWM_PulseFinished

5526
上一篇: 为什么你的std::async任务不并发?深度剖析launch policy的隐秘行为
下一篇: 你真的会用import吗?C++20模块导入机制内幕详解(仅限专家知晓)
CodePulse
博客等级 码龄2年 187粉丝 2233原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值