首页 > 编程语言 >C++:STL六大组件,知识点总结。

C++:STL六大组件,知识点总结。

时间:2024-08-24 18:52:03浏览次数:10  
标签:std 知识点 迭代 容器 STL C++ 对象 算法 内存

STL知识点总结

STL是C++标准库中的一个重要部分,提供了一组灵活通用的数据结构,核心是模板类。
接下来是STL的主要组件及其功能简介。

1. 容器

容器是用来存储和管理一组数据的对象。不同的容器适用于不同类型的数据存储需求。

可理解为各种形式实现的存储结构

顺序容器

  • vector: 动态数组,支持快速随机访问和尾部插入/删除操作。
  • deque: 双端队列,支持快速随机访问和头尾插入/删除操作。
  • list: 双向链表,支持快速插入/删除操作,不支持随机访问。
  • array: 固定大小的数组,支持快速随机访问,但大小在编译时确定。
  • forward_list: 单向链表,只支持单向遍历和快速插入/删除操作。

关联容器

  • set: 集合,存储唯一元素,自动排序,支持快速查找、插入、删除操作。
  • map: 映射(字典),存储键值对,按键自动排序,支持快速查找、插入、删除操作。
  • multiset: 允许重复元素的集合,自动排序。
  • multimap: 允许重复键的映射,自动排序。

无序关联容器

  • unordered_set: 无序集合,使用哈希表实现,支持快速查找、插入、删除操作。
  • unordered_map: 无序映射,使用哈希表实现。
  • unordered_multiset: 无序多重集合,允许重复元素。
  • unordered_multimap: 无序多重映射,允许重复键。

2. 迭代器

迭代器是用于遍历容器中的元素的指针类对象,为容器提供了统一的访问接口。

可理解为该存储结构的头指针,哨兵等用来访问数组的东西。所以例如动态数组Vector,在扩容后由于扩容后的数组与原数组无关,会导致原迭代器失效。

  • 输入迭代器(Input Iterator): 只读访问,单向遍历。
  • 输出迭代器(Output Iterator): 只写访问,单向遍历。
  • 前向迭代器(Forward Iterator): 读写访问,单向遍历。
  • 双向迭代器(Bidirectional Iterator): 读写访问,支持双向遍历。
  • 随机访问迭代器(Random Access Iterator): 读写访问,支持双向遍历和随机访问。

3. 算法

STL提供了一系列通用算法用于操作容器中的数据,这些算法大多是以函数模板的形式提供的。

可理解为执行部分操作的方法,即算法,例如数组的sort本质是快排。

  • 非修改算法: 如for_eachfindcount等,这些算法不修改容器内容。
  • 修改算法: 如copyswapreplace等,这些算法会改变容器的内容。
  • 排序算法: 如sortpartial_sortstable_sort等,用于排序容器中的元素。
  • 搜索算法: 如binary_searchlower_boundupper_bound等,用于在有序容器中查找元素。
  • 数值算法: 如accumulateinner_productadjacent_difference等,用于数值计算。

4. 函数对象

函数对象是重载了operator()的对象,可以像函数一样调用。STL中的许多算法可以接受函数对象作为参数,这些对象可以封装复杂的操作。

可理解为对该数据结构封装,给出某个操作。

  • 标准函数对象: 如std::plusstd::minusstd::greaterstd::less等,封装了基本的算术和比较操作。
  • 自定义函数对象: 用户可以定义自己的函数对象以实现特定的操作。

5. 适配器

适配器是一类修改容器、迭代器或函数行为的组件。

可以理解为对封装的内容进行二次封装。

  • 容器适配器: 如stack(栈)、queue(队列)、priority_queue(优先队列),它们是对其他容器的包装,提供特定的数据访问方式。
  • 迭代器适配器: 如reverse_iteratorback_insert_iteratorfront_insert_iteratorinsert_iterator等,用于改变迭代器的行为。
  • 函数适配器: 如std::bindstd::mem_fnstd::function,用于调整或封装函数调用方式。

6. 空间配置器

空间配置器是STL中负责内存管理的组件。它们定义了内存的分配与释放策略,以及对象的构造与析构方式。默认的空间配置器是std::allocator,它提供了针对动态内存分配的一般性实现。用户也可以自定义自己的空间配置器,以满足特定的性能需求或内存管理策略。

可理解为负责内存管理的机制或策略。

主要功能

  • 内存分配: 负责分配指定大小的原始内存块(通常未初始化)。
  • 内存释放: 释放之前分配的内存块。
  • 对象构造与析构: 在已分配的内存上构造对象,并在对象生命周期结束时析构对象。

自定义空间配置器
用户可以通过实现std::allocator的接口或继承自其基类,来自定义内存分配策略。比如,在嵌入式系统中,可能需要自定义空间配置器以控制内存的精确使用,减少碎片化。

标签:std,知识点,迭代,容器,STL,C++,对象,算法,内存
From: https://blog.csdn.net/m0_73727069/article/details/141503350

相关文章

  • rustlings v6.0 运行时出现 “ You are trying to run Rustlings using the old metho
    背景在之前学习rust时,使用过一段时间rustlings感觉还不错,但是之前的学习只把rustlings的题目刷了一半,然后想再从头到尾刷一遍rustlings的题目。在rustlings的README.md文档中也没有找到重置rustlings的方法,而且官方的分支也更新到了v6.2.0(我之前使用的似乎是v5.......
  • Qt/C++音视频开发81-采集本地麦克风/本地摄像头带麦克风/桌面采集和麦克风/本地设备和
    一、前言随着直播的兴起,采集本地摄像头和麦克风进行直播推流,也是一个刚需,最简单的做法是直接用ffmpeg命令行采集并推流,这种方式简单粗暴,但是不能实时预览画面,而且不方便加上一些特殊要求。之前就已经打通了音视频文件和视频流的采集,那是不是可以简单点的方式就能直接加入到原有的......
  • [底层原理] C/C++获取时间(将时间戳转换为年月日)?
    前言大家都知道,计算机中存储的时间是一个整数,在现在的编程语言中,可以很方便地将时间戳(整数)转换为字符串,但是如果没有这些我们该如何自己计算出呢?刚好以前研究过Nginx的源代码,我以他的代码为例,说明其背后的数学原理。当然在工程实践中,没有必要花时间自己实现转换的函数,所以本......
  • 【C++】类与对象篇三
    【C++】类与对象篇三一.运算符重载1运算符重载2赋值运算符重载3前置++和后置++重载4.const成员5.取地址及const取地址操作符重载一.运算符重载1运算符重载C++为了增强代码的可读性引入了运算符重载,运算符重载是具有特殊函数名的函数函数名字为:关键字o......
  • 解决 C/C++ 程序执行一闪而过的方法
    作者:一去、二三里个人微信号:iwaleon微信公众号:高效程序员在VS编写控制台程序的时候,包括使用其他IDE(VisualC++)编写C/C++程序,经常会看到程序的执行结果一闪而过,要解决这个问题,可以在代码的最后加上system("pause")、getchar()、cin.get()。推荐方法比较常用的做......
  • C++11
    类型推导类型推导是C++的一种特性,允许编译器自动推导变量的类型,而不需要显式地制定类型。autoauto用于让编译器自动推导变量类型,常见用法:基本示例:autox=10;与容器一起使用:vector<string>names={"Alice","Bob"};for(autoit=names.begin();it!=names.en......
  • C++调用Python和numpy第三方库计算MFCC音频特征实现封装发布
    目录项目简介程序/数据集下载环境准备执行步骤1.新建python虚拟环境2.虚拟环境运行下python代码3.迁移虚拟环境4.编写Cmakelists.txt5.编写C++代码6.编译项目7.测试项目简介深度学习程序的边缘部署以性能绝佳的C++为主(⊙﹏⊙),但遇到项目开发周期短,则以功能优先,一些复杂的算法和......
  • nginx知识点
    1、nginx的角色web服务器、缓存服务器、做反向代理和负载均衡2、proxy_pass加不加斜杠的区别主机:192.168.20.144:80(1)、proxy_pass后面有斜杠 location/api/{ proxy_passhttp://192.168.20.145:80/ } 当用户去访问http://192.168.20.144:80/api时会代理到http://19......
  • 从零开始学习C++之结构体
    前言之前讲过变量,讲了数据类型(如int等),而结构体就相当于创造一个类型。定义结构体首先,写上一个神圣不可侵犯的(bushi)struct。好了,不开玩笑了。在程序外围定义(一般写在命名空间后面)。struct名字{ 含有的东西。};一定一定要有分号!!!例:定义存储坐标的结构体structzuo......
  • 从零开始学习C++之函数
    前言作者看着200行的主函数大模拟返回了WA,陷入了沉思......咋办?把每个模块包装一下就知道哪里出错了,所以,今天讲函数。(太生硬了吧。。。)定义一个函数格式:返回值类型函数名(变量*n){ 代码}例如:intadd(inta,intb){ returna+b;}注:定义函数中的每个变量必......