C++,STL 六大组件:容器、迭代器、算法、函数对象、适配器、分配器

请添加图片描述

文章目录

  • 引言
  • 一、容器(Containers)
    • 主要分类
  • 二、迭代器(Iterators)
  • 三、算法(Algorithms)
  • 四、函数对象(Functors)
  • 五、适配器(Adapters)
  • 六、分配器(Allocators)
  • 结语


引言

C++ 标准模板库(Standard Template Library, STL)是泛型编程的典范,其核心思想是通过高度抽象的组件实现数据结构和算法的解耦。STL 的成功离不开其六大核心组件的协同工作:容器(Containers)、迭代器(Iterators)、算法(Algorithms)、函数对象(Functors)、适配器(Adapters)和分配器(Allocators)。这些组件各司其职,共同构建了一个高效、灵活且通用的编程框架。本文将深入解析这六大组件的功能、用法及其相互关系。


一、容器(Containers)

容器是 STL 的基础,用于存储和管理数据集合。所有容器均通过模板实现,支持任意数据类型,且提供统一的操作接口。

主要分类

  1. 顺序容器:

    • vector:动态数组,支持快速随机访问,尾部插入高效。
    • list:双向链表,插入/删除高效,但随机访问性能差。
    • deque:双端队列,支持头部和尾部高效插入。
  2. 关联容器:

    • set/multiset:基于红黑树的有序集合,元素自动排序。
    • map/multimap:键值对集合,键唯一(map)或允许多键(multimap)。
  3. 无序容器:(C++11+)

    • unordered_set/unordered_map:基于哈希表,查询效率接近 O(1)。

示例代码:

#include <vector>
#include <unordered_map>

std::vector<int> nums = {1, 2, 3};  // 动态数组
std::unordered_map<std::string, int> wordCount = {{"apple", 5}, {"banana", 3}};  // 哈希表

二、迭代器(Iterators)

迭代器是访问容器元素的通用接口,类似于指针,但抽象了底层容器的实现细节。它充当容器和算法之间的桥梁,使得算法可以独立于容器类型工作。

迭代器分类:

  1. 输入迭代器:只读,单向移动(如 istream_iterator)。
  2. 输出迭代器:只写,单向移动(如 ostream_iterator)。
  3. 前向迭代器:可读写,单向移动(如 forward_list 的迭代器)。
  4. 双向迭代器:可双向移动(如 list 的迭代器)。
  5. 随机访问迭代器:支持随机跳转(如 vector 的迭代器)。

示例代码:

std::vector<int> vec = {3, 1, 4, 1, 5};
for (auto it = vec.begin(); it != vec.end(); ++it) {
    std::cout << *it << " ";  // 通过迭代器遍历容器
}

三、算法(Algorithms)

STL 提供了超过 100 种泛型算法,涵盖排序、查找、数值计算等操作。这些算法通过迭代器操作容器,无需依赖具体容器类型。

常用算法:

  • 排序与查找:sort(), find(), binary_search()
  • 修改操作:copy(), replace(), reverse()
  • 数值计算:accumulate(), inner_product()

示例代码:

#include <algorithm>
std::vector<int> nums = {5, 3, 9, 1};
std::sort(nums.begin(), nums.end());  // 排序算法
auto it = std::find(nums.begin(), nums.end(), 9);  // 查找元素

四、函数对象(Functors)

函数对象(仿函数)是重载了 operator() 的类实例,可以像函数一样调用。它常用于定制算法的行为(如比较、转换逻辑)。

常见用途:

  • 比较器:std::less<>, std::greater<>
  • 算术操作:std::plus<>, std::multiplies<>
  • 自定义逻辑:结合 Lambda 表达式(C++11+)

示例代码:

#include <functional>
std::vector<int> nums = {1, 4, 2, 8};
// 使用 greater<> 降序排序
std::sort(nums.begin(), nums.end(), std::greater<int>());

// 使用 Lambda 表达式过滤偶数
auto isEven = [](int x) { return x % 2 == 0; };
auto it = std::find_if(nums.begin(), nums.end(), isEven);

五、适配器(Adapters)

适配器基于现有组件扩展功能,通过限制或调整接口满足特定需求。

常见适配器类型:

  1. 容器适配器
    • stack:基于 deque 或 list 实现后进先出(LIFO)。
    • queue:基于 deque 实现先进先出(FIFO)。
    • priority_queue:基于 vector 实现堆结构。
  2. 迭代器适配器
    • reverse_iterator:反向遍历容器。
    • back_insert_iterator:尾部插入元素的迭代器。

示例代码:

#include <stack>
std::stack<int> s;  // 默认基于 deque
s.push(10);
s.push(20);
s.pop();  // 弹出 20

六、分配器(Allocators)

分配器负责管理容器的内存分配与释放。默认使用 std::allocator,通常无需直接操作,但在需要优化内存性能(如内存池)时非常有用。

核心功能:

  • allocate():分配内存块。
  • deallocate():释放内存块。
  • construct()/destroy():构造或析构对象。

示例场景:

// 自定义分配器(伪代码)
template<typename T>
class CustomAllocator {
    // 实现 allocate, deallocate 等方法
};

std::vector<int, CustomAllocator<int>> customVec;  // 使用自定义分配器

结语

STL 的六大组件通过高度解耦的设计,实现了数据管理、算法逻辑和内存控制的分离。这种设计不仅提高了代码的复用性和性能,还让开发者能够专注于业务逻辑而非底层细节。

  • 容器负责存储数据,迭代器提供访问接口,算法实现通用逻辑。
  • 函数对象和适配器扩展了灵活性,分配器优化了内存管理。

掌握这六大组件,是高效使用 STL 的关键。建议通过实际项目练习其组合应用(如结合 Lambda 与算法、使用容器适配器实现特定数据结构),并参考《Effective STL》等书籍深入理解最佳实践。

STL 不仅是工具库,更是一种编程哲学的体现——通过抽象和泛型,让代码更简洁、更强大。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

STM32项目分享:智能鱼缸

目录 一、前言 二、项目简介 1.功能详解 2.主要器件 三、原理图设计 四、PCB硬件设计 PCB图 五、程序设计 六、实验效果 七、包含内容 项目分享 一、前言 项目成品图片&#xff1a; 哔哩哔哩视频链接&#xff1a; STM32智能鱼缸/水族箱 &#xff08;资料分享见文末…

基于MinIO的对象存储增删改查

MinIO是一个高性能的分布式对象存储服务。Python的minio库可操作MinIO&#xff0c;包括创建/列出存储桶、上传/下载/删除文件及列出文件。 查看帮助信息 minio.exe --help minio.exe server --help …

14-6-1C++STL的list

(一&#xff09;list容器的基本概念 list容器简介&#xff1a; 1.list是一个双向链表容器&#xff0c;可高效地进行插入删除元素 2.list不可以随机存取元素&#xff0c;所以不支持at.(pos)函数与[ ]操作符 &#xff08;二&#xff09;list容器头部和尾部的操作 list对象的默…

汽车网络信息安全-ISO/SAE 21434解析(中)

目录 第七章-分布式网络安全活动 1. 供应商能力评估 2. 报价 3. 网络安全职责界定 第八章-持续的网络安全活动 1. 网路安全监控 2. 网络安全事件评估 3. 漏洞分析 4. 漏洞管理 第九章-概念阶段 1. 对象定义 2. 网路安全目标 3. 网络安全概念 第十章 - 产品开发 第十…

C#分页思路:双列表数据组合返回设计思路

一、应用场景 需要分页查询&#xff08;并非全表查载入物理内存再筛选&#xff09;&#xff0c;返回列表1和列表2叠加的数据时 二、实现方式 列表1必查&#xff0c;列表2根据列表1的查询结果决定列表2的分页查询参数 三、示意图及其实现代码 1.示意图 黄色代表list1的数据&a…

YOLOv8源码修改(4)- 实现YOLOv8模型剪枝(任意YOLO模型的简单剪枝)

目录 前言 1. 需修改的源码文件 1.1添加C2f_v2模块 1.2 修改模型读取方式 1.3 增加 L1 正则约束化训练 1.4 在tensorboard上增加BN层权重和偏置参数分布的可视化 1.5 增加剪枝处理文件 2. 工程目录结构 3. 源码文件修改 3.1 添加C2f_v2模块和模型读取 3.2 添加L1正则…

【Block总结】DynamicFilter,动态滤波器降低计算复杂度,替换传统的MHSA|即插即用

论文信息 标题: FFT-based Dynamic Token Mixer for Vision 论文链接: https://arxiv.org/pdf/2303.03932 关键词: 深度学习、计算机视觉、对象检测、分割 GitHub链接: https://github.com/okojoalg/dfformer 创新点 本论文提出了一种新的标记混合器&#xff08;token mix…

设计模式Python版 原型模式

文章目录 前言一、原型模式二、原型模式示例三、原型管理器 前言 GOF设计模式分三大类&#xff1a; 创建型模式&#xff1a;关注对象的创建过程&#xff0c;包括单例模式、简单工厂模式、工厂方法模式、抽象工厂模式、原型模式和建造者模式。结构型模式&#xff1a;关注类和对…

一文讲解Java中的BIO、NIO、AIO之间的区别

BIO、NIO、AIO是Java中常见的三种IO模型 BIO&#xff1a;采用阻塞式I/O模型&#xff0c;线程在执行I/O操作时被阻塞&#xff0c;无法处理其他任务&#xff0c;适用于连接数比较少的场景&#xff1b;NIO&#xff1a;采用非阻塞 I/O 模型&#xff0c;线程在等待 I/O 时可执行其…

使用 postman 测试思源笔记接口

思源笔记 API 权鉴 官方文档-中文&#xff1a;https://github.com/siyuan-note/siyuan/blob/master/API_zh_CN.md 权鉴相关介绍截图&#xff1a; 对应的xxx&#xff0c;在软件中查看 如上图&#xff1a;在每次发送 API 请求时&#xff0c;需要在 Header 中添加 以下键值对&a…

AWTK 骨骼动画控件发布

Spine 是一款广泛使用的 2D 骨骼动画工具&#xff0c;专为游戏开发和动态图形设计设计。它通过基于骨骼的动画系统&#xff0c;帮助开发者创建流畅、高效的角色动画。本项目是基于 Spine 实现的 AWTK 骨骼动画控件。 代码&#xff1a;https://gitee.com/zlgopen/awtk-widget-s…

新年手搓--本地化部署DeepSeek-R1,全程实测

1.环境准备安装ollma ollma官网链接: Download Ollama on Linux ubuntu命令行安装: curl -fsSL https://ollama.com/install.sh | sh 选择运行模型,用7b模型试一下(模型也差不多5G): ollama run deepseek-r1:7b 运行qwen: ollama run qwen2.5:7b 2.为方便运行…

STM32使用VScode开发

文章目录 Makefile形式创建项目新建stm项目下载stm32cubemx新建项目IED makefile保存到本地arm gcc是编译的工具链G++配置编译Cmake +vscode +MSYS2方式bilibiliMSYS2 统一环境配置mingw32-make -> makewindows环境变量Cmake CmakeListnijia 编译输出elfCMAKE_GENERATOR查询…

【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】1.21 索引宗师:布尔索引的七重境界

1.21 索引宗师&#xff1a;布尔索引的七重境界 目录 #mermaid-svg-Iojpgw5hl0Ptb9Ti {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-Iojpgw5hl0Ptb9Ti .error-icon{fill:#552222;}#mermaid-svg-Iojpgw5hl0Ptb9Ti .…

毕业设计--具有车流量检测功能的智能交通灯设计

摘要&#xff1a; 随着21世纪机动车保有量的持续增加&#xff0c;城市交通拥堵已成为一个日益严重的问题。传统的固定绿灯时长方案导致了大量的时间浪费和交通拥堵。为解决这一问题&#xff0c;本文设计了一款智能交通灯系统&#xff0c;利用车流量检测功能和先进的算法实现了…

课题推荐:基于matlab,适用于自适应粒子滤波的应用

自适应粒子滤波&#xff08;Adaptive Particle Filter, APF&#xff09;是一种用于状态估计的有效方法&#xff0c;特别适用于非线性和非高斯系统。 文章目录 应用场景MATLAB 代码示例代码说明结果扩展说明 以下是一个基于自适应粒子滤波的简单应用示例&#xff0c;模拟一个一维…

Redis(5,jedis和spring)

在前面的学习中&#xff0c;只是学习了各种redis的操作&#xff0c;都是在redis命令行客户端操作的&#xff0c;手动执行的&#xff0c;更多的时候就是使用redis的api&#xff08;&#xff09;&#xff0c;进一步操作redis程序。 在java中实现的redis客户端有很多&#xff0c;…

基于聚类与相关性分析对马来西亚房价数据进行分析

碎碎念&#xff1a;由于最近太忙了&#xff0c;更新的比较慢&#xff0c;提前祝大家新春快乐&#xff0c;万事如意&#xff01;本数据集的下载地址&#xff0c;读者可以自行下载。 1.项目背景 本项目旨在对马来西亚房地产市场进行初步的数据分析&#xff0c;探索各州的房产市…

(2025 年最新)MacOS Redis Desktop Manager中文版下载,附详细图文

MacOS Redis Desktop Manager中文版下载 大家好&#xff0c;今天给大家带来一款非常实用的 Redis 可视化工具——Redis Desktop Manager&#xff08;简称 RDM&#xff09;。相信很多开发者都用过 Redis 数据库&#xff0c;但如果你想要更高效、更方便地管理 Redis 数据&#x…

智慧园区管理系统为企业提供高效运作与风险控制的智能化解决方案

内容概要 快鲸智慧园区管理系统&#xff0c;作为一款备受欢迎的智能化管理解决方案&#xff0c;致力于为企业提供高效的运作效率与风险控制优化。具体来说&#xff0c;这套系统非常适用于工业园、产业园、物流园、写字楼及公寓等多种园区和商办场所。它通过数字化与智能化的手…