文章目录

C++ STL 容器:vector、map、set 的基本操作

发布于 2026-04-07 06:32:36 · 浏览 10 次 · 评论 0 条
  1. 引入标准库头文件 #include <vector>#include <iostream>,启用动态数组与基础输入输出功能。
  2. 声明容器实例 vector<int> data;,创建一个初始为空的整数序列(底层为连续内存块,长度随元素增加自动翻倍扩容)。
  3. 尾部追加调用 data.push_back(10); 将新数值放置于当前有效区间的末端。
  4. 统计规模执行 size_t count = data.size(); 获取容器内实际持有的元素总数,该返回值类型专为匹配内存地址差设计。
  5. 安全访问使用 data.at(2) 读取第三个位置的元素,若索引越界将直接抛出异常中断程序,防止内存越界读取产生脏数据。
  6. 直接索引输入 data[2] = 99; 快速覆盖目标位置数值(注意:此写法不检查边界,需开发者自行保证 2 < data.size())。
  7. 末尾截断调用 data.pop_back(); 移除最后一个元素,容器逻辑长度减一,底层内存暂不释放。
  8. 区间删除执行 data.erase(data.begin() + 1, data.begin() + 3); 移除第二至第三个元素,后续元素自动前移填补空缺。
  9. 预留空间运行 data.reserve(100); 提前向操作系统申请足够容纳 100 个整数的连续内存,避免频繁扩容引发数据搬移损耗。
  10. 顺序遍历编写范围 for 循环 for (const int& val : data) { std::cout << val << " "; },以只读引用方式逐个提取元素,禁止拷贝以提升执行效率。
  11. 清空容器调用 data.clear(); 销毁所有内部元素并重置逻辑长度为零,配合 vector<int>().swap(data); 可彻底归还底层物理内存。

  1. 加载关联模块 #include <set>,准备使用键值唯一且自动维护顺序的关联容器(特性:底层采用红黑树实现,插入即排序,天然过滤重复项)。
  2. 初始化空集合定义 set<double> measurements;,创建一个浮点数收纳盒,系统将按升序排列后续存入的数值。
  3. 尝试插入执行 measurements.insert(3.14);measurements.insert(2.71);,容器自动比较大小并调整树节点结构,若再次插入 3.14 则直接丢弃不占空间。
  4. 判定存在输入 bool has = measurements.count(3.14);,返回 1 证明数据已驻留,返回 0 证明查无此项(集合键唯一,结果仅限 0 或 1)。
  5. 精准定位调用 auto it = measurements.find(2.71); 获取指向该数值的迭代器指针(作用类似书签)。
  6. 校验指针编写 if (it != measurements.end()) { std::cout << "Found: " << *it; },确认书签未指向末尾虚拟哨兵,再解引用获取实际数值。
  7. 指定删除执行 measurements.erase(3.14); 按值精确剥离目标节点,树结构自动重组以维持平衡与排序。
  8. 批量剔除输入 measurements.erase(it1, it2); 传入两个迭代器划定范围,一次性切除区间内所有元素,效率高于循环单删。
  9. 提取边界调用 double first = *measurements.begin();double last = *measurements.rbegin(); 直接捕获最小值与最大值,避免全量扫描。
  10. 正向遍历编写循环 for (const auto& m : measurements) { std::cout << m << " "; } 默认输出升序序列;改用 rbegin()rend() 可获取降序排列结果。

  1. 包含字典组件 #include <map>,启用基于键值对(Key-Value)存储的映射表(逻辑类似电话簿:通过姓名瞬间查找到对应号码,键按字典序严格排序)。
  2. 构建映射声明 map<std::string, int> ages; 建立文本键与整数值的绑定关系,底层同样依赖树结构维持高速检索能力。
  3. 快速录入使用 ages["Alice"] = 25; 直接通过中括号赋值。注意:若键已存在则覆盖旧值;若键不存在,系统会静默创建新节点并将值初始化为 0,随后再赋值为 25。
  4. 安全读取改用 auto it = ages.find("Bob"); if (it != ages.end()) { int age = it->second; } 优先通过 find 验证,彻底杜绝无意中生成空键污染数据表。
  5. 批量打包调用 ages.insert(std::make_pair("Charlie", 30));ages.insert({"David", 28}); 构造完整键值对一次性插入,避免覆盖风险。
  6. 统计命中执行 ages.count("Alice"); 返回 1 确认人员档案已登记。映射表中键具有绝对唯一性,该方法仅用于布尔验证。
  7. 条件擦除输入 ages.erase("David"); 精确移除该档案。容器自动回收对应内存,后续查询将立即返回未命中状态。
  8. 遍历字典编写 for (const auto& entry : ages) { std::cout << entry.first << " -> " << entry.second << "\n"; } 依次解包键与值,迭代器始终按升序推进。
  9. 修改值域定位 it = ages.find("Alice"); if (it != ages.end()) it->second = 26; 通过迭代器直接篡改映射的右半部分数值,左半部分键名受保护不可变更。
  10. 彻底重置调用 ages.clear(); 切断所有键值关联并释放节点,恢复至初始空白状态,为下一轮数据填充做好准备。

评论 (0)

暂无评论,快来抢沙发吧!

扫一扫,手机查看

扫描上方二维码,在手机上查看本文