当前位置: 首页 > news >正文

深入用法示例 + 完整 Visual Studio 项目结构 最常用、最重要的三个容器为例进行深入讲解

✅ 深入用法示例 + 完整 Visual Studio 项目结构

我以最常用、最重要的三个容器为例进行深入讲解

  • std::vector(迭代器失效规则重点)
  • std::map/std::set(自定义比较器)
  • std::priority_queue(自定义比较器 + 底层容器)

1. std::vector 深入用法

迭代器失效规则(面试高频)
vector<int>v={1,2,3,4,5};autoit=v.begin()+2;// 指向 3v.push_back(6);// 可能触发扩容 → it 失效!v.insert(v.begin(),0);// 插入开头 → it 及之后所有迭代器失效// 安全写法v.erase(v.begin()+1);// erase 返回下一个有效迭代器it=v.erase(it);// 必须这样更新迭代器

失效规则总结

  • push_back/insert:若触发扩容,则所有迭代器失效;否则仅插入点之后迭代器失效。
  • erase/clear:被删除元素及之后迭代器失效。
  • reserve/shrink_to_fit:可能导致迭代器失效。
自定义内存分配器(高级)
template<typenameT>classLoggingAllocator{public:usingvalue_type=T;T*allocate(size_t n){std::cout<<"[Alloc] "<<n<<" * "<<sizeof(T)<<" bytes\n";returnstatic_cast<T*>(::operatornew(n*sizeof(T)));}voiddeallocate(T*p,size_t n){std::cout<<"[Dealloc] "<<n<<" elements\n";::operatordelete(p);}};voidVectorAllocatorDemo(){vector<int,LoggingAllocator<int>>v;v.reserve(100);v.push_back(42);}

2. std::map / std::set 自定义比较器

structPerson{string name;intage;};// 自定义比较器(按年龄排序,年龄相同按名字)structPersonComparator{booloperator()(constPerson&a,constPerson&b)const{if(a.age!=b.age)returna.age<b.age;returna.name<b.name;}};voidMapComparatorDemo(){map<Person,string,PersonComparator>m;m[{"Alice",25}]="Engineer";m[{"Bob",20}]="Student";m[{"Charlie",25}]="Designer";for(constauto&p:m){cout<<p.first.name<<" ("<<p.first.age<<") : "<<p.second<<endl;}}

注意:自定义比较器必须满足严格弱序(Strict Weak Ordering)。


3. std::priority_queue 自定义比较器

// 默认是大顶堆(greater 变成小顶堆)voidPriorityQueueDemo(){// 小顶堆(最小值优先)priority_queue<int,vector<int>,greater<int>>minHeap;minHeap.push(5);minHeap.push(1);minHeap.push(3);cout<<"最小值: "<<minHeap.top()<<endl;// 1// 自定义结构体 + 比较器autocmp=[](constPerson&a,constPerson&b){returna.age>b.age;// 年龄小的优先(小顶堆)};priority_queue<Person,vector<Person>,decltype(cmp)>ageHeap(cmp);ageHeap.push({"Bob",20});ageHeap.push({"Alice",25});cout<<"年龄最小: "<<ageHeap.top().name<<endl;}

完整 Visual Studio 项目文件结构

推荐项目结构
STLAdvancedDemo/ ├── STLAdvancedDemo.sln ├── STLAdvancedDemo.vcxproj ├── main.cpp ├── VectorDemo.cpp ├── AssociativeDemo.cpp ├── PriorityDemo.cpp └── include/ └── LoggingAllocator.h
main.cpp
#include<iostream>usingnamespacestd;voidVectorDemo();voidVectorAllocatorDemo();voidMapComparatorDemo();voidPriorityQueueDemo();intmain(){cout<<"=== STL 容器进阶演示 ===\n\n";cout<<"1. Vector 迭代器失效演示\n";VectorDemo();cout<<"\n2. 自定义分配器\n";VectorAllocatorDemo();cout<<"\n3. map/set 自定义比较器\n";MapComparatorDemo();cout<<"\n4. priority_queue 自定义比较器\n";PriorityQueueDemo();return0;}

创建项目步骤(Visual Studio 2022):

  1. 文件新建项目空项目(C++)
  2. 项目名称:STLAdvancedDemo
  3. 把上面所有.cpp文件添加到项目
  4. 项目属性 →C/C++语言C++ 语言标准ISO C++17 标准
  5. 生成生成解决方案本地 Windows 调试器运行

扩展练习建议

  1. 实现一个自定义比较器的unordered_map(需要提供hashequal_to
  2. 研究vector增长策略(通常是 1.5~2 倍扩容)
  3. 尝试用list+map自己实现一个LRU Cache

需要我继续提供下面任意一个的完整代码吗?

  • 自定义 Hash + Equal 的unordered_map示例
  • 迭代器失效的完整测试用例
  • 带内存分配器统计的vector压测示例

随时告诉我,我立刻补充!

http://www.jsqmd.com/news/1096997/

相关文章:

  • Windows系统文件AdmTmpl.dll丢失找不到问题解决
  • 别再为系统扰动头疼了!手把手教你用扩张状态观测器网络(ESOnet)搞定复杂不确定性
  • SurroundOcc 实战:从数据加载到可视化,构建端到端3D场景重建流程
  • 山东诺亚创生带您了解脐带胎盘干细胞:被误解的生命初始“建材”
  • 我家的佳能TS5380,打印着作用的时候突然报错5b00,5b02这个故障码,带到维修店维修,说要150元费用,太贵没有就修带回来了,网上说清零软件就可以修好,之后找到 V6.200这个版本的清零软件
  • Gemini 集成 Android Auto 引隐私担忧,这些设置更改让驾车更具隐私性
  • SAP MRP元素全解:从代码到场景的应用指南
  • 终极跨平台文本编辑解决方案:Notepad--让中文编码和文件对比变得简单
  • 【生产环境禁用警告】:VMware磁盘映射到主机的3大高危操作(附vSphere PowerCLI一键检测脚本)
  • 【转帖】高考生注意了!21个投档录取问题汇总
  • 22年网络建设与运维国赛iscsi服务
  • Element Plus虚拟化表格el-table-v2自定义渲染实战:从JS函数到JSX语法的性能与开发体验对比
  • 别再为Shapely安装报错发愁了!手把手教你根据Python版本和系统选对whl文件
  • Windows系统文件AIComponentMgmt.dll丢失找不到问题解决
  • 一人公司必备AI工具:5分钟将详情页变出30条高转化获客笔记
  • Vue二维码组件深度解析:qrcode.vue 3种高效生成方案对比
  • Diablo Edit2:暗黑破坏神II存档编辑器的二进制数据处理革命
  • 高效Minecraft服务器包生成工具:ServerPackCreator深度解析与实战指南
  • GitOps——让Git成为唯一的“真相来源“
  • SAP委外PO:从供应商委外到工序委外的核心逻辑与实战配置
  • 基于第三方API的代购系统对接实现——从商品同步到物流追踪的全链路方案
  • 【HSPICE】从SPICE内核到仿真实战:电路设计的核心引擎
  • 保姆级教程:用MATLAB脚本在STK里一键生成Walker星座(附完整代码)
  • 别再手动点Download了!用Python调用NCBI Datasets API批量下载基因FASTA序列(附完整代码)
  • Three.js 道路流光教程
  • 3步拯救损坏视频:Untrunc视频修复工具终极指南
  • 新手搭建 OpenClaw 智能代理,系统拦截与路径问题处理办法(含安装包)
  • Destiny 2 Solo Enabler:终极单人游戏解决方案,重新掌控你的游戏体验
  • ArkTS传参
  • ZonyLrcToolsX跨平台歌词下载实战指南:从基础到高级应用