STL 库基础概念与示例

news2025/6/7 15:40:09

一、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. 关键注意点
  1. vector 不支持 << 运算符输出
    • 需手动遍历元素,不能直接 cout << v;
  2. set 的键不可修改
    • 若需修改键值,必须先删除旧元素,再插入新元素。
  3. 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2401266.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spring MVC参数绑定终极手册:单多参/对象/集合/JSON/文件上传精讲

我们通过浏览器访问不同的路径&#xff0c;就是在发送不同的请求&#xff0c;在发送请求时&#xff0c;可能会带一些参数&#xff0c;本文将介绍了Spring MVC中处理不同请求参数的多种方式 一、传递单个参数 接收单个参数&#xff0c;在Spring MVC中直接用方法中的参数就可以&…

Fluence推出“Pointless计划”:五种方式参与RWA算力资产新时代

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

innovus: ecoAddRepeater改变hier层级解决办法

我正在「拾陆楼」和朋友们讨论有趣的话题&#xff0c;你⼀起来吧&#xff1f; 拾陆楼知识星球入口 来自星球提问: 星主&#xff0c;我在A/B/C/D/E/U0这个cell后面插入一个BUFF&#xff0c;生成的名字为A/B/C/BUFF1&#xff0c;少了D/E两个层级&#xff0c;不应该是生成A/B/C/…

华为OD机试真题——硬件产品销售方案(2025A卷:100分)Java/python/JavaScript/C++/C语言/GO六种最佳实现

2025 A卷 100分 题型 本文涵盖详细的问题分析、解题思路、代码实现、代码详解、测试用例以及综合分析; 并提供Java、python、JavaScript、C++、C语言、GO六种语言的最佳实现方式! 2025华为OD真题目录+全流程解析/备考攻略/经验分享 华为OD机试真题《硬件产品销售方案》: 目录…

传统业务对接AI-AI编程框架-Rasa的业务应用实战(1)--项目背景即学习初衷

我的初衷&#xff1a;我想学习AI。具体的方向是这样的&#xff1a;原本传统的平台业务去对接智能体。比如发票业务&#xff0c;发票的开具、审核、计税、回款等。根据用户在业务系统前台界面输入若干提示词 或者 语音输入简短语音信息&#xff0c;可以通过智能体给出需要处理的…

低功耗架构突破:STM32H750 与 SD NAND (存储芯片)如何延长手环续航至 14 天

低功耗架构突破&#xff1a;STM32H750 与 SD NAND &#xff08;存储芯片&#xff09;如何延长手环续航至 14 天 卓越性能强化安全高效能效图形处理优势丰富集成特性 模拟模块实时监控保障数据完整性提升安全性与可靠性测量原理采样率相关结束语 在智能皮电手环及数据存储技术不…

Linux(11)——基础IO(上)

目录 一、理解文件 二、回顾C文件的接口 &#x1f4c4; C语言文件操作函数表 ​编辑&#x1f4c4; 三个文件流 三、系统文件I/O 1️⃣open 2️⃣close 3️⃣write 4️⃣read 四、文件描述符 &#x1f4a1;用户操作文件的底层逻辑是什么&#xff1f; &#x1f4…

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博客 项目之间的引用关系。 ​​ 目…

Hive自定义函数案例(UDF、UDAF、UDTF)

目录 前提条件 背景 概念及适用场景 UDF&#xff08;User-Defined Function&#xff09; 概念 适用场景 UDAF&#xff08;User-Defined Aggregate Function&#xff09; 概念 适用场景 UDTF&#xff08;User-Defined Table-Generating Function&#xff09; 概念 适…

【学习笔记】Circuit Tracing: Revealing Computational Graphs in Language Models

Circuit Tracing: Revealing Computational Graphs in Language Models 替代模型(Replacement Model)&#xff1a;用更多的可解释的特征来替代transformer模型的神经元。 归因图(Attribution Graph)&#xff1a;展示特征之间的相互影响&#xff0c;能够追踪模型生成输出时所采用…

STM32标准库-TIM定时器

文章目录 一、TIM定时器1.1定时器1.2定时器类型1.1.1 高级定时器1.1.2通用定时器1.1.3基本定时器 二、定时中断基本结构预分频器时器计时器时序计数器无预装时序计数器有预装时序RCC时钟树 三、定时器定时中断3.1 接线图3.2代码3.3效果&#xff1a; 四、定时器外部中断4.1接线图…

Kafka 如何保证顺序消费

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

【算法题】算法一本通

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

Modbus转Ethernet IP赋能挤出吹塑机智能监控

在现代工业自动化领域&#xff0c;小疆智控Modbus转Ethernet IP网关GW-EIP-001与挤出吹塑机的应用越来越广泛。这篇文章将为您详细解读这两者的结合是如何提高生产效率&#xff0c;降低维护成本的。首先了解什么是Modbus和Ethernet IP。Modbus是一种串行通信协议&#xff0c;它…

什么是终端安全管理系统(终端安全管理软件2024科普)

在当今数字化迅速发展的时代&#xff0c;企业面临着越来越多的信息安全威胁。为了应对这些挑战&#xff0c;保障公司数据的安全性和完整性&#xff0c;终端安全管理系统&#xff08;Endpoint Security Management System&#xff09;应运而生。 本文将为您深入浅出地科普2024年…

【JVM】Java类加载机制

【JVM】Java类加载机制 什么是类加载&#xff1f; 在 Java 的世界里&#xff0c;每一个类或接口在经过编译后&#xff0c;都会生成对应的 .class 字节码文件。 所谓类加载机制&#xff0c;就是 JVM 将这些 .class 文件中的二进制数据加载到内存中&#xff0c;并对其进行校验…

《C++初阶之入门基础》【C++的前世今生】

【C的前世今生】目录 前言&#xff1a;---------------起源---------------一、历史背景二、横空出世---------------发展---------------三、标准立世C98&#xff1a;首个国际标准版本C03&#xff1a;小修订版本 四、现代进化C11&#xff1a;现代C的开端C14&#xff1a;对C11的…

Apache APISIX

目录 Apache APISIX是什么&#xff1f; Lua Lua 的主要特点&#xff1a; Lua 的常见应用&#xff1a; CVE-2020-13945(Apache APISIX默认API Token导致远程Lua代码执行) ​编辑Lua脚本解析 CVE-2021-45232(Apache APISIX Dashboard API权限绕过导致RCE) Apache …

如何在 git dev 中创建合并请求

先将 自己的代码 推到 自己的远程的 分支上 在 创建 合并请求 根据提示 将 自己的远程的 源码 合并到 对应的分支上 然后 创建 合并请求 等待 对应的 人 来 进行合并就行

基于nlohmann/json 实现 从C++对象转换成JSON数据格式

C对象的JSON序列化与反序列化 基于JsonCpp库实现C对象序列化与反序列化 JSON 介绍 JSON作为一种轻量级的数据交换格式&#xff0c;在Web服务和应用程序中广泛使用。 JSON&#xff08;JavaScript Object Notation&#xff09;是一种轻量级的数据交换格式&#xff0c;易于人阅读…