C++ STL 容器:vector、map、set 的基本操作
- 引入标准库头文件
#include <vector> 与 #include <iostream>,启用动态数组与基础输入输出功能。
- 声明容器实例
vector<int> data;,创建一个初始为空的整数序列(底层为连续内存块,长度随元素增加自动翻倍扩容)。
- 尾部追加调用
data.push_back(10); 将新数值放置于当前有效区间的末端。
- 统计规模执行
size_t count = data.size(); 获取容器内实际持有的元素总数,该返回值类型专为匹配内存地址差设计。
- 安全访问使用
data.at(2) 读取第三个位置的元素,若索引越界将直接抛出异常中断程序,防止内存越界读取产生脏数据。
- 直接索引输入
data[2] = 99; 快速覆盖目标位置数值(注意:此写法不检查边界,需开发者自行保证 2 < data.size())。
- 末尾截断调用
data.pop_back(); 移除最后一个元素,容器逻辑长度减一,底层内存暂不释放。
- 区间删除执行
data.erase(data.begin() + 1, data.begin() + 3); 移除第二至第三个元素,后续元素自动前移填补空缺。
- 预留空间运行
data.reserve(100); 提前向操作系统申请足够容纳 100 个整数的连续内存,避免频繁扩容引发数据搬移损耗。
- 顺序遍历编写范围
for 循环 for (const int& val : data) { std::cout << val << " "; },以只读引用方式逐个提取元素,禁止拷贝以提升执行效率。
- 清空容器调用
data.clear(); 销毁所有内部元素并重置逻辑长度为零,配合 vector<int>().swap(data); 可彻底归还底层物理内存。
- 加载关联模块
#include <set>,准备使用键值唯一且自动维护顺序的关联容器(特性:底层采用红黑树实现,插入即排序,天然过滤重复项)。
- 初始化空集合定义
set<double> measurements;,创建一个浮点数收纳盒,系统将按升序排列后续存入的数值。
- 尝试插入执行
measurements.insert(3.14); 与 measurements.insert(2.71);,容器自动比较大小并调整树节点结构,若再次插入 3.14 则直接丢弃不占空间。
- 判定存在输入
bool has = measurements.count(3.14);,返回 1 证明数据已驻留,返回 0 证明查无此项(集合键唯一,结果仅限 0 或 1)。
- 精准定位调用
auto it = measurements.find(2.71); 获取指向该数值的迭代器指针(作用类似书签)。
- 校验指针编写
if (it != measurements.end()) { std::cout << "Found: " << *it; },确认书签未指向末尾虚拟哨兵,再解引用获取实际数值。
- 指定删除执行
measurements.erase(3.14); 按值精确剥离目标节点,树结构自动重组以维持平衡与排序。
- 批量剔除输入
measurements.erase(it1, it2); 传入两个迭代器划定范围,一次性切除区间内所有元素,效率高于循环单删。
- 提取边界调用
double first = *measurements.begin(); 与 double last = *measurements.rbegin(); 直接捕获最小值与最大值,避免全量扫描。
- 正向遍历编写循环
for (const auto& m : measurements) { std::cout << m << " "; } 默认输出升序序列;改用 rbegin() 至 rend() 可获取降序排列结果。
- 包含字典组件
#include <map>,启用基于键值对(Key-Value)存储的映射表(逻辑类似电话簿:通过姓名瞬间查找到对应号码,键按字典序严格排序)。
- 构建映射声明
map<std::string, int> ages; 建立文本键与整数值的绑定关系,底层同样依赖树结构维持高速检索能力。
- 快速录入使用
ages["Alice"] = 25; 直接通过中括号赋值。注意:若键已存在则覆盖旧值;若键不存在,系统会静默创建新节点并将值初始化为 0,随后再赋值为 25。
- 安全读取改用
auto it = ages.find("Bob"); if (it != ages.end()) { int age = it->second; } 优先通过 find 验证,彻底杜绝无意中生成空键污染数据表。
- 批量打包调用
ages.insert(std::make_pair("Charlie", 30)); 或 ages.insert({"David", 28}); 构造完整键值对一次性插入,避免覆盖风险。
- 统计命中执行
ages.count("Alice"); 返回 1 确认人员档案已登记。映射表中键具有绝对唯一性,该方法仅用于布尔验证。
- 条件擦除输入
ages.erase("David"); 精确移除该档案。容器自动回收对应内存,后续查询将立即返回未命中状态。
- 遍历字典编写
for (const auto& entry : ages) { std::cout << entry.first << " -> " << entry.second << "\n"; } 依次解包键与值,迭代器始终按升序推进。
- 修改值域定位
it = ages.find("Alice"); if (it != ages.end()) it->second = 26; 通过迭代器直接篡改映射的右半部分数值,左半部分键名受保护不可变更。
- 彻底重置调用
ages.clear(); 切断所有键值关联并释放节点,恢复至初始空白状态,为下一轮数据填充做好准备。
暂无评论,快来抢沙发吧!