【C/C++】STL学习所得

文章目录

    • [STL 框架核心组成部分](#STL 框架核心组成部分)
    • [STL 序列容器分类](#STL 序列容器分类)
    • [STL 容器适配器分类](#STL 容器适配器分类)
    • [STL 迭代器分类](#STL 迭代器分类)
    • [STL 中一些易混淆知识点](#STL 中一些易混淆知识点)
    • 一些重要的简述

STL 框架核心组成部分

  1. 算法
  2. 容器
  3. 迭代器
  4. 适配器
  5. 空间配置器
  6. 访函数

STL 序列容器分类

  1. vector
  2. queue
  3. list
  4. array
  5. forward_list

STL 容器适配器分类

  1. stack 栈
  2. queue 队列
  3. priority_queue 优先级队列

STL 迭代器分类

  1. 输入迭代器;
  2. 输出迭代器;
  3. 正向迭代器;
  4. 双向迭代器;
  5. 随机迭代器

STL 中一些易混淆知识点

  1. STL 是谁开发的?

    STL 是由A_xx、M_xx、D_xx 三个大佬在惠普实验室开发的。

  2. array 容器会支持边界检查吗?

    不支持。可以利用容器的at方法,进行判断array容器中即将访问的元素是否存在,若不存在at方法,会返回std::out_of_range的异常。

  3. deque 容器支持一次性删除多个元素吗?

    支持。比如:

cpp 复制代码
// 删除索引为1到3的元素(包括1和3)
dq.erase(dq.begin() + 1, dq.begin() + 4);
  1. 迭代器是指针吗?

    迭代器不一定是指针,但它们可以类似于指针的操作。迭代器是一种抽象的概念,它提供了对容器中元素的访问和操作的方式。

    对于大多数STL容器,迭代器通常是一个类对象,而不是指针。这是因为STL迭代器需要提供更多的功能,例如支持随机访问、迭代器失效处理等。迭代器类对象通常会重载一些运算符,以实现类似指针的操作,如解引用、自增、自减等。

    然而,对于一些底层的容器,如std::array和std::vector,它们的迭代器可以是指针。这是因为这些容器在内存中是连续存储的,因此可以直接使用指针来表示迭代器。

  2. vector 容器中的iterator 迭代器是随机迭代器吗?

    是的。因为vector容器的内存是连续的,所以可以进行随机访问容器内存。

一些重要的简述

  1. 简述 STL 中迭代器与C++指针的异同点。
bash 复制代码
相同点:

都用于访问和操作数据结构中的元素。

都支持解引用操作,可以通过迭代器或指针获取元素的值。

都支持自增和自减操作,可以在容器或数组中移动到下一个或上一个元素。

异同点:

类型:迭代器是STL中的一种抽象概念,可以是类对象,也可以是指针。而指针是C++语言中的原生类型。

功能:迭代器提供了更多的功能,如随机访问、迭代器失效处理等。指针只提供了基本的指针操作。

范围:迭代器可以用于不同类型的容器,如vector、list、deque等。指针主要用于数组和指针类型。

安全性:迭代器提供了一些安全机制,如边界检查、失效处理等,以防止访问越界或失效的迭代器。指针没有这些安全机制,需要程序员自己负责边界检查和失效处理。

迭代器分类:STL中的迭代器有多种分类,如输入迭代器、输出迭代器、前向迭代器、双向迭代器和随机访问迭代器。每种迭代器都有不同的功能和限制。指针可以被视为随机访问迭代器。

总的来说,迭代器是STL中用于访问和操作容器元素的抽象概念,提供了更多的功能和安全机制。指针是C++语言中的原生类型,主要用于数组和指针类型,功能相对较简单。在使用STL时,迭代器是首选的元素访问方式,而指针则更适用于一些特定的场景。
bash 复制代码
vector:
1. 类似于动态数组,增删过程中自动调整自身大小。即vector容器可自动处理存储数据所需的空间;
2. 容器内存空间具有连续性;
3. 新增插入元素,元素位置越靠前,插入效率越低;同样的,删除元素,该元素位置越靠前,删除效率越低;
4. 用一个vector容器初始化另一个vector容器的元素,元素类型必须相同;
5. vector 迭代器存在失效风险。原因是,因为vector容器是一个顺序容器,内存是连续的,当增删元素后,为了保证容器数据连续性,容器中元素会移动,相应地数据地址也发生了变化,所以迭代器访问时就会失效出错。
bash 复制代码
deque:
1、deque容器与vector容器相似,都是动态内存管理;
2、与vector容器相比,deque容器支持两端增删元素;
3、与vector容器相比,不支持vector容器的reserve、capacity、data,新增了pop_front(), push_front(), 用于从队列首部弹出与插入元素的方法;
bash 复制代码
array:
1、array容器大小固定,不允许增删容器元素;
  1. 简述关联容器中各个容器的特点。
    关联容器,都是以二叉树作为内部数据结构,可实现高效查找元素,但是不可以进行任意位置的操作。
bash 复制代码
set与multiset:
1、二者都是集合(区别在于对于重复元素的允许。前者允许,后者拒绝);
2、二者要求存储的数据类型一致;
3、二者都支持增删查,对于修改,不可以直接进行修改(因为二叉树中元素变动,必须自动排序),若需要修改元素,必须要先查找到原元素,删除原先元素,再进行新增新元素,新元素会被放置到一个自动排序的位子。
bash 复制代码
map与multimap:
1、二者都是映射,类似于字典;
2、前者映射,不允许存在重复的键值元素对,然后,后者映射,允许重复的键值元素对。
相关推荐
使者大牙5 分钟前
【大语言模型学习笔记】第一篇:LLM大规模语言模型介绍
笔记·学习·语言模型
As977_27 分钟前
前端学习Day12 CSS盒子的定位(相对定位篇“附练习”)
前端·css·学习
ajsbxi30 分钟前
苍穹外卖学习记录
java·笔记·后端·学习·nginx·spring·servlet
Rattenking31 分钟前
React 源码学习01 ---- React.Children.map 的实现与应用
javascript·学习·react.js
TeYiToKu1 小时前
笔记整理—linux驱动开发部分(9)framebuffer驱动框架
linux·c语言·arm开发·驱动开发·笔记·嵌入式硬件·arm
dsywws1 小时前
Linux学习笔记之时间日期和查找和解压缩指令
linux·笔记·学习
道法自然04021 小时前
Ethernet 系列(8)-- 基础学习::ARP
网络·学习·智能路由器
互联网打工人no11 小时前
每日一题——第一百二十四题
c语言
爱吃生蚝的于勒1 小时前
深入学习指针(5)!!!!!!!!!!!!!!!
c语言·开发语言·数据结构·学习·计算机网络·算法
羊小猪~~1 小时前
数据结构C语言描述2(图文结合)--有头单链表,无头单链表(两种方法),链表反转、有序链表构建、排序等操作,考研可看
c语言·数据结构·c++·考研·算法·链表·visual studio