文章目录
-
- [STL 框架核心组成部分](#STL 框架核心组成部分)
- [STL 序列容器分类](#STL 序列容器分类)
- [STL 容器适配器分类](#STL 容器适配器分类)
- [STL 迭代器分类](#STL 迭代器分类)
- [STL 中一些易混淆知识点](#STL 中一些易混淆知识点)
- 一些重要的简述
STL 框架核心组成部分
- 算法
- 容器
- 迭代器
- 适配器
- 空间配置器
- 访函数
STL 序列容器分类
- vector
- queue
- list
- array
- forward_list
STL 容器适配器分类
- stack 栈
- queue 队列
- priority_queue 优先级队列
STL 迭代器分类
- 输入迭代器;
- 输出迭代器;
- 正向迭代器;
- 双向迭代器;
- 随机迭代器
STL 中一些易混淆知识点
-
STL 是谁开发的?
STL 是由A_xx、M_xx、D_xx 三个大佬在惠普实验室开发的。
-
array 容器会支持边界检查吗?
不支持。可以利用容器的at方法,进行判断array容器中即将访问的元素是否存在,若不存在at方法,会返回std::out_of_range的异常。
-
deque 容器支持一次性删除多个元素吗?
支持。比如:
cpp
// 删除索引为1到3的元素(包括1和3)
dq.erase(dq.begin() + 1, dq.begin() + 4);
-
迭代器是指针吗?
迭代器不一定是指针,但它们可以类似于指针的操作。迭代器是一种抽象的概念,它提供了对容器中元素的访问和操作的方式。
对于大多数STL容器,迭代器通常是一个类对象,而不是指针。这是因为STL迭代器需要提供更多的功能,例如支持随机访问、迭代器失效处理等。迭代器类对象通常会重载一些运算符,以实现类似指针的操作,如解引用、自增、自减等。
然而,对于一些底层的容器,如std::array和std::vector,它们的迭代器可以是指针。这是因为这些容器在内存中是连续存储的,因此可以直接使用指针来表示迭代器。
-
vector 容器中的iterator 迭代器是随机迭代器吗?
是的。因为vector容器的内存是连续的,所以可以进行随机访问容器内存。
一些重要的简述
- 简述 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容器大小固定,不允许增删容器元素;
- 简述关联容器中各个容器的特点。
关联容器,都是以二叉树作为内部数据结构,可实现高效查找元素,但是不可以进行任意位置的操作。
bash
set与multiset:
1、二者都是集合(区别在于对于重复元素的允许。前者允许,后者拒绝);
2、二者要求存储的数据类型一致;
3、二者都支持增删查,对于修改,不可以直接进行修改(因为二叉树中元素变动,必须自动排序),若需要修改元素,必须要先查找到原元素,删除原先元素,再进行新增新元素,新元素会被放置到一个自动排序的位子。
bash
map与multimap:
1、二者都是映射,类似于字典;
2、前者映射,不允许存在重复的键值元素对,然后,后者映射,允许重复的键值元素对。