STL 库基础概念与示例
一、STL 库基础概念与示例
1. 容器分类
顺序容器
- 核心特性:按元素插入顺序存储,支持下标访问(类似数组),动态扩展内存。
- 典型容器:
vector
(动态数组)。 - 适用场景:需要频繁按顺序访问、尾部插入 / 删除的场景(如队列、栈模拟)。
关联容器
- 核心特性:按元素值的大小自动排序(默认升序),存储位置由值决定,键唯一(
set
/map
的键不可重复)。 - 典型容器:
set
:键值合一(存储的值即键),用于唯一值存储和快速查找。map
:键值对存储(key-value
),键唯一,值可重复。
- 底层结构:二叉搜索树(
set
/map
默认使用红黑树,插入时自动平衡排序)。
2. 常用容器操作对比
操作 | vector(顺序容器) | set(关联容器) | map(关联容器) |
---|---|---|---|
构造 | vector<int> v; | set<int> s; | map<string, int> m; |
新增元素 | v.push_back(10); (尾部插入) | s.insert(10); (自动去重、排序) | m.insert({"apple", 5}); 或 m["apple"] = 5; |
删除元素 | v.erase(it); (需迭代器定位) | s.erase(10); (直接传值删除) | m.erase("apple"); (按键删除) |
修改元素 | v[0] = 20; (下标直接修改) | 不可直接修改键(需 s.erase(old_val); s.insert(new_val); ) | m["apple"] = 10; (直接修改值) |
查询元素 | 需自定义 find 函数(线性查找) | s.find(10) != s.end(); (返回迭代器) | m.find("apple") != m.end(); (按键查找) |
遍历方式 | 下标遍历、迭代器、范围 for | 迭代器、范围 for (不支持下标) | 迭代器、范围 for |
排序 | 需调用 sort(v.begin(), v.end()); | 自动排序(插入时二叉树调整) | 自动按键排序 |
3. 关键注意点
vector
不支持<<
运算符输出- 需手动遍历元素,不能直接
cout << v;
。
- 需手动遍历元素,不能直接
set
的键不可修改- 若需修改键值,必须先删除旧元素,再插入新元素。
map
的键唯一,值可重复- 键用于排序和查找,值可灵活修改(如统计频率)。
二、示例代码
示例 1:vector 存储整数(顺序容器)
cpp
#include <iostream>
#include <vector>
#include <algorithm> // 用于sort
using namespace std;int main() {vector<int> nums;// 插入元素nums.push_back(3);nums.push_back(1);nums.push_back(2);// 遍历(下标方式)cout << "插入顺序:";for (int i = 0; i < nums.size(); i++) {cout << nums[i] << " "; // 输出:3 1 2}// 排序(需手动调用sort)sort(nums.begin(), nums.end());cout << "\n排序后:";for (auto num : nums) { // 范围for遍历cout << num << " "; // 输出:1 2 3}return 0;
}
关键点:vector
按插入顺序存储,需手动排序,支持下标和迭代器遍历。
示例 2:set 统计唯一字符(关联容器)和 去重
cpp
#include <iostream>
#include <set>
using namespace std;int main() {string str = "hello";set<char> unique_chars;// 插入字符(自动去重,'l' 只存一次)for (char c : str) {unique_chars.insert(c);}// 遍历(自动排序:'e', 'h', 'l', 'o')cout << "唯一字符:";for (char c : unique_chars) {cout << c << " "; // 输出:e h l o}return 0;
}
#include <iostream> // 包含输入输出流头文件,用于cin/cout
#include <set> // 包含set容器头文件,用于有序存储和自动去重
#include <string> // 包含字符串头文件,用于处理输入的字符序列
using namespace std; // 使用标准命名空间,简化代码书写// 定义Data类,用于存储字符及其出现次数
class Data {
private:char ch; // 私有成员:存储字符(作为set的键,决定排序和唯一性)int count; // 私有成员:存储字符出现的次数
public:// 构造函数:初始化字符和计数,默认计数为1(首次出现)Data(char ch, int count = 1) : ch(ch), count(count) {}// 重载<运算符:用于set容器排序(按字符的ASCII值升序)bool operator<(const Data& r) const { return ch < r.ch; // 比较字符大小,确保set有序存储}// 重载后增量运算符++(int):处理字符重复出现的计数增加void operator++(int) const { // 由于函数为const,需通过强制类型转换修改非const成员(注意:此写法不推荐,可能破坏const正确性)((Data*)this)->count++; }// 显示函数:输出字符及其出现次数void show() const { cout << ch << "出现了:" << count << "次" << endl; }
};int main() {while (1) { // 无限循环,持续处理用户输入set<Data> s; // 创建set容器,存储Data对象(自动去重、按ch排序)string str; // 用于存储用户输入的字符串cout << "请输入字符:";cin >> str; // 读取用户输入的一行字符// 遍历输入字符串的每个字符for (int i = 0; str[i]; i++) { // 插入字符到set中,insert返回pair<iterator, bool>:// first为插入位置迭代器,second表示是否插入成功(true=新插入,false=已存在)auto p = s.insert(Data(str[i])); // 如果插入失败(字符已存在),则找到已存在的元素并增加计数if (!p.second) { (*p.first)++; // 通过迭代器访问已存在的Data对象,调用后增量运算符}}// 遍历set,输出每个字符的出现次数(set自动按ch排序)for (auto ele : s) { ele.show(); // 调用show方法输出结果}}return 0;
}
关键点:set
自动去重并按字符 ASCII 值排序,插入重复元素无效。
示例 3:map 统计单词频率(关联容器)
cpp
#include <iostream>
#include <map>
#include <string>
using namespace std;int main() {string sentence = "apple banana apple orange";map<string, int> word_freq; // key=单词,value=频率// 统计频率(用operator[]修改值)for (string word : {"apple", "banana", "apple", "orange"}) {word_freq[word]++; // 键不存在时自动创建,值初始化为0后+1}// 遍历输出(按键自动排序:apple, banana, orange)cout << "单词频率:" << endl;for (const auto& pair : word_freq) {cout << pair.first << ": " << pair.second << endl;// 输出:// apple: 2// banana: 1// orange: 1}return 0;
}
关键点:map
按键自动排序,operator[]
简化值的修改,键唯一(重复插入同一键会更新值)。
三、总结
- 顺序容器(如
vector
)适合 “按顺序操作” 场景,需手动处理排序和查找。 - 关联容器(如
set
/map
)适合 “快速查找、去重、排序” 场景,底层二叉树结构保证高效操作(O(log n)
)。 - 开发中根据需求选择容器:需顺序访问选
vector
,需唯一键选set
,需键值对选map
。
相关文章:
STL 库基础概念与示例
一、STL 库基础概念与示例 1. 容器分类 顺序容器 核心特性:按元素插入顺序存储,支持下标访问(类似数组),动态扩展内存。典型容器:vector(动态数组)。适用场景:需要频繁…...

Spring MVC参数绑定终极手册:单多参/对象/集合/JSON/文件上传精讲
我们通过浏览器访问不同的路径,就是在发送不同的请求,在发送请求时,可能会带一些参数,本文将介绍了Spring MVC中处理不同请求参数的多种方式 一、传递单个参数 接收单个参数,在Spring MVC中直接用方法中的参数就可以&…...

Fluence推出“Pointless计划”:五种方式参与RWA算力资产新时代
2025年6月1日,去中心化算力平台 Fluence 正式宣布启动“Pointless 计划”——这是其《Fluence Vision 2026》战略中四项核心举措之一,旨在通过贡献驱动的积分体系,激励更广泛的社区参与,为用户带来现实世界资产(RWA&am…...

innovus: ecoAddRepeater改变hier层级解决办法
我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧? 拾陆楼知识星球入口 来自星球提问: 星主,我在A/B/C/D/E/U0这个cell后面插入一个BUFF,生成的名字为A/B/C/BUFF1,少了D/E两个层级,不应该是生成A/B/C/…...

华为OD机试真题——硬件产品销售方案(2025A卷:100分)Java/python/JavaScript/C++/C语言/GO六种最佳实现
2025 A卷 100分 题型 本文涵盖详细的问题分析、解题思路、代码实现、代码详解、测试用例以及综合分析; 并提供Java、python、JavaScript、C++、C语言、GO六种语言的最佳实现方式! 2025华为OD真题目录+全流程解析/备考攻略/经验分享 华为OD机试真题《硬件产品销售方案》: 目录…...
突破数据孤岛:StarRocks联邦查询实战指南
随着企业数据生态的复杂化,跨多个数据存储系统进行联合查询的需求日益增长。本文将深入解析如何利用StarRocks构建高效的数据联邦查询体系,实现与Apache Doris和Hive数据仓库的无缝对接。 ### 一、StarRocks联邦查询架构解析 StarRocks采用分布式架构设…...

传统业务对接AI-AI编程框架-Rasa的业务应用实战(1)--项目背景即学习初衷
我的初衷:我想学习AI。具体的方向是这样的:原本传统的平台业务去对接智能体。比如发票业务,发票的开具、审核、计税、回款等。根据用户在业务系统前台界面输入若干提示词 或者 语音输入简短语音信息,可以通过智能体给出需要处理的…...

低功耗架构突破:STM32H750 与 SD NAND (存储芯片)如何延长手环续航至 14 天
低功耗架构突破:STM32H750 与 SD NAND (存储芯片)如何延长手环续航至 14 天 卓越性能强化安全高效能效图形处理优势丰富集成特性 模拟模块实时监控保障数据完整性提升安全性与可靠性测量原理采样率相关结束语 在智能皮电手环及数据存储技术不…...
CSS选择子元素
通过选择器 为所有子元素应用样式。以下是几种常见方法: 1. 选择所有直接子元素(不包括孙级) css 复制 下载 .parent > * {/* 样式规则 */color: red; } > 选择器:只匹配直接子元素 * 通配符:匹配任意类型…...
git cherry-pick (28)
1.1 目的 本文档用于说明如何git上,通过cherry-pick命令合并某个功能。 将分支bg_device的 AHB New feature support libalgo arm64 lib 提交内容合并至 分支spfl_device 分支当中 1.2适配步骤 1.2.1 实操过程 > 分支sfpl_device的状态 rootxrootx-ThinkPad:~/workdir…...
android与Qt类比
一、概念对应关系 Android RecyclerView 组件类比描述Qt 模型 - 视图组件Qt 类比描述RecyclerView画板(容器)QAbstractItemView视图(展示数据的容器,如列表、表格)RecyclerView.Adapter画布(数据桥梁&…...
AX513CE 是一款针对模组渠道市场前端IPC应用而设计的数字SOC芯片 支持高清CMOS Sensor输入 国产品牌
AX513CE 是一款针对模组渠道市场前端IPC应用而设计的数字SOC芯片 支持高清CMOS Sensor输入 国产品牌 产品概述: AX513CE 是一款针对模组渠道市场前端IPC应用而设计的数字SOC芯片,支持高清CMOS Sensor输入,经ISP处理、视频前处理以及音视频编…...

Linux(11)——基础IO(上)
目录 一、理解文件 二、回顾C文件的接口 📄 C语言文件操作函数表 编辑📄 三个文件流 三、系统文件I/O 1️⃣open 2️⃣close 3️⃣write 4️⃣read 四、文件描述符 💡用户操作文件的底层逻辑是什么? Ǵ…...

ABP-Book Store Application中文讲解 - Part 9: Authors: User Interface
ABP-Book Store Application中文讲解 - Part 9: Authors: User Interface TBD 1. 汇总 ABP-Book Store Application中文讲解-汇总-CSDN博客 2. 前一章 ABP-Book Store Application中文讲解 - Part 8: Authors: Application Layer-CSDN博客 项目之间的引用关系。 目…...
鸿蒙开发修改版本几个步骤
鸿蒙开发修改版本几个步骤 比如:5.0.4(16)版本改为5.0.2(14)版本 一、项目下的build-profile.json5 "products": [{"name": "default","signingConfig": "default&qu…...

Hive自定义函数案例(UDF、UDAF、UDTF)
目录 前提条件 背景 概念及适用场景 UDF(User-Defined Function) 概念 适用场景 UDAF(User-Defined Aggregate Function) 概念 适用场景 UDTF(User-Defined Table-Generating Function) 概念 适…...

【学习笔记】Circuit Tracing: Revealing Computational Graphs in Language Models
Circuit Tracing: Revealing Computational Graphs in Language Models 替代模型(Replacement Model):用更多的可解释的特征来替代transformer模型的神经元。 归因图(Attribution Graph):展示特征之间的相互影响,能够追踪模型生成输出时所采用…...
3D视觉重构工业智造:解码迁移科技如何用“硬核之眼“重塑生产节拍
一、工业视觉的进化论:从CCD到3D相机的范式革命 在汽车冲压车间里,传统CCD相机正面临四大检测困局: 平面感知局限:二维视觉无法捕捉曲面工件形变环境适应性差:反光板件导致误检率超12%动态捕捉延迟:传送带…...
Elasticsearch中的刷新(Refresh)和刷新间隔介绍
在 Elasticsearch 中,刷新(Refresh) 是控制索引数据何时对搜索可见的机制,而 刷新间隔(Refresh Interval) 则是配置该机制执行频率的参数。理解这两个概念对于平衡搜索实时性与写入性能至关重要。 一、刷新(Refresh)的本质 Lucene 索引结构与搜索可见性Elasticsearch …...

STM32标准库-TIM定时器
文章目录 一、TIM定时器1.1定时器1.2定时器类型1.1.1 高级定时器1.1.2通用定时器1.1.3基本定时器 二、定时中断基本结构预分频器时器计时器时序计数器无预装时序计数器有预装时序RCC时钟树 三、定时器定时中断3.1 接线图3.2代码3.3效果: 四、定时器外部中断4.1接线图…...
【算法训练营Day05】哈希表part1
文章目录 哈希表理论基础有效的字母异位词两个数组的交集快乐数两数之和 哈希表理论基础 几个值得关注的知识点: hash表用于快速的判断元素是否存在(空间换时间)其原理就是将数据通过散列函数映射到bucket中,如果发生hash碰撞&a…...
CMap应用场景和例子
CMap 详解 CMap 是 MFC (Microsoft Foundation Classes) 库中的一个模板类,用于实现键值对的映射关系(类似哈希表或字典)。它提供了高效的数据存储和检索功能,适用于需要通过键快速查找值的场景。 基本模板参数 cpp 运行 tem…...

Kafka 如何保证顺序消费
在消息队列的应用场景中,保证消息的顺序消费对于一些业务至关重要,例如金融交易中的订单处理、电商系统的库存变更等。Kafka 作为高性能的分布式消息队列系统,通过巧妙的设计和配置,能够实现消息的顺序消费。接下来,我…...

【算法题】算法一本通
每周更新至完结,建议关注收藏点赞。 目录 待整理文章已整理的文章方法论思想总结模版工具总结排序 数组与哈希表栈双指针(滑动窗口、二分查找、链表)树前缀树堆 优先队列(区间/间隔问题、贪心 )回溯图一维DP位操作数学…...

Modbus转Ethernet IP赋能挤出吹塑机智能监控
在现代工业自动化领域,小疆智控Modbus转Ethernet IP网关GW-EIP-001与挤出吹塑机的应用越来越广泛。这篇文章将为您详细解读这两者的结合是如何提高生产效率,降低维护成本的。首先了解什么是Modbus和Ethernet IP。Modbus是一种串行通信协议,它…...
C++中如何遍历map?
文章目录 1. 使用范围for循环(C11及以上)2. 使用迭代器3. 使用反向迭代器注意事项 在C中, std::map 是一种关联容器,它存储的是键值对(key-value pairs),并且按键的顺序进行排序。遍历 std::m…...

什么是终端安全管理系统(终端安全管理软件2024科普)
在当今数字化迅速发展的时代,企业面临着越来越多的信息安全威胁。为了应对这些挑战,保障公司数据的安全性和完整性,终端安全管理系统(Endpoint Security Management System)应运而生。 本文将为您深入浅出地科普2024年…...
书籍转圈打印矩阵(8)0604
题目 给定一个整型矩阵matrix,请按照转圈的方式打印它。 例如: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 打印结果为:1,2,3ÿ…...

【JVM】Java类加载机制
【JVM】Java类加载机制 什么是类加载? 在 Java 的世界里,每一个类或接口在经过编译后,都会生成对应的 .class 字节码文件。 所谓类加载机制,就是 JVM 将这些 .class 文件中的二进制数据加载到内存中,并对其进行校验…...
Elasticsearch中的自定义分析器(Custom Analyzer)介绍
在 Elasticsearch 中,自定义分析器(Custom Analyzer) 是一种可配置的文本处理组件,允许用户通过组合分词器(Tokenizer)、过滤器(Token Filter)和字符过滤器(Character Filter)来定义特定的文本分析逻辑。这使得 Elasticsearch 能够针对不同语言、业务场景或特殊需求,…...