深入用法示例 + 完整 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.hmain.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):
- 文件→新建→项目→空项目(C++)
- 项目名称:
STLAdvancedDemo - 把上面所有
.cpp文件添加到项目 - 项目属性 →C/C++→语言→C++ 语言标准→ISO C++17 标准
- 生成→生成解决方案→本地 Windows 调试器运行
扩展练习建议:
- 实现一个自定义比较器的
unordered_map(需要提供hash和equal_to) - 研究
vector的增长策略(通常是 1.5~2 倍扩容) - 尝试用
list+map自己实现一个LRU Cache
需要我继续提供下面任意一个的完整代码吗?
- 自定义 Hash + Equal 的
unordered_map示例 - 迭代器失效的完整测试用例
- 带内存分配器统计的
vector压测示例
随时告诉我,我立刻补充!
