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

深入用法示例 + 完整 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压测示例

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