深入用法示例 + 完整 Visual Studio 项目结构 最常用、最重要的三个容器为例进行深入讲解
✅ 深入用法示例 完整 Visual Studio 项目结构我以最常用、最重要的三个容器为例进行深入讲解std::vector迭代器失效规则重点std::map/std::set自定义比较器std::priority_queue自定义比较器 底层容器1. std::vector 深入用法迭代器失效规则面试高频vectorintv{1,2,3,4,5};autoitv.begin()2;// 指向 3v.push_back(6);// 可能触发扩容 → it 失效v.insert(v.begin(),0);// 插入开头 → it 及之后所有迭代器失效// 安全写法v.erase(v.begin()1);// erase 返回下一个有效迭代器itv.erase(it);// 必须这样更新迭代器失效规则总结push_back/insert若触发扩容则所有迭代器失效否则仅插入点之后迭代器失效。erase/clear被删除元素及之后迭代器失效。reserve/shrink_to_fit可能导致迭代器失效。自定义内存分配器高级templatetypenameTclassLoggingAllocator{public:usingvalue_typeT;T*allocate(size_t n){std::cout[Alloc] n * sizeof(T) bytes\n;returnstatic_castT*(::operatornew(n*sizeof(T)));}voiddeallocate(T*p,size_t n){std::cout[Dealloc] n elements\n;::operatordelete(p);}};voidVectorAllocatorDemo(){vectorint,LoggingAllocatorintv;v.reserve(100);v.push_back(42);}2. std::map / std::set 自定义比较器structPerson{string name;intage;};// 自定义比较器按年龄排序年龄相同按名字structPersonComparator{booloperator()(constPersona,constPersonb)const{if(a.age!b.age)returna.ageb.age;returna.nameb.name;}};voidMapComparatorDemo(){mapPerson,string,PersonComparatorm;m[{Alice,25}]Engineer;m[{Bob,20}]Student;m[{Charlie,25}]Designer;for(constautop:m){coutp.first.name (p.first.age) : p.secondendl;}}注意自定义比较器必须满足严格弱序Strict Weak Ordering。3. std::priority_queue 自定义比较器// 默认是大顶堆greater 变成小顶堆voidPriorityQueueDemo(){// 小顶堆最小值优先priority_queueint,vectorint,greaterintminHeap;minHeap.push(5);minHeap.push(1);minHeap.push(3);cout最小值: minHeap.top()endl;// 1// 自定义结构体 比较器autocmp[](constPersona,constPersonb){returna.ageb.age;// 年龄小的优先小顶堆};priority_queuePerson,vectorPerson,decltype(cmp)ageHeap(cmp);ageHeap.push({Bob,20});ageHeap.push({Alice,25});cout年龄最小: ageHeap.top().nameendl;}完整 Visual Studio 项目文件结构推荐项目结构STLAdvancedDemo/ ├── STLAdvancedDemo.sln ├── STLAdvancedDemo.vcxproj ├── main.cpp ├── VectorDemo.cpp ├── AssociativeDemo.cpp ├── PriorityDemo.cpp └── include/ └── LoggingAllocator.hmain.cpp#includeiostreamusingnamespacestd;voidVectorDemo();voidVectorAllocatorDemo();voidMapComparatorDemo();voidPriorityQueueDemo();intmain(){cout STL 容器进阶演示 \n\n;cout1. Vector 迭代器失效演示\n;VectorDemo();cout\n2. 自定义分配器\n;VectorAllocatorDemo();cout\n3. map/set 自定义比较器\n;MapComparatorDemo();cout\n4. priority_queue 自定义比较器\n;PriorityQueueDemo();return0;}创建项目步骤Visual Studio 2022文件→新建→项目→空项目C项目名称STLAdvancedDemo把上面所有.cpp文件添加到项目项目属性 →C/C→语言→C 语言标准→ISO C17 标准生成→生成解决方案→本地 Windows 调试器运行扩展练习建议实现一个自定义比较器的unordered_map需要提供hash和equal_to研究vector的增长策略通常是 1.5~2 倍扩容尝试用listmap自己实现一个LRU Cache需要我继续提供下面任意一个的完整代码吗自定义 Hash Equal 的unordered_map示例迭代器失效的完整测试用例带内存分配器统计的vector压测示例随时告诉我我立刻补充