【C/C++】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 容器支持一次性删除多个元素吗?
    支持。比如:

// 删除索引为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++指针的异同点。
相同点:

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

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

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

异同点:

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

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

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

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

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

总的来说,迭代器是STL中用于访问和操作容器元素的抽象概念,提供了更多的功能和安全机制。指针是C++语言中的原生类型,主要用于数组和指针类型,功能相对较简单。在使用STL时,迭代器是首选的元素访问方式,而指针则更适用于一些特定的场景。
vector:
1. 类似于动态数组,增删过程中自动调整自身大小。即vector容器可自动处理存储数据所需的空间;
2. 容器内存空间具有连续性;
3. 新增插入元素,元素位置越靠前,插入效率越低;同样的,删除元素,该元素位置越靠前,删除效率越低;
4. 用一个vector容器初始化另一个vector容器的元素,元素类型必须相同;
5. vector 迭代器存在失效风险。原因是,因为vector容器是一个顺序容器,内存是连续的,当增删元素后,为了保证容器数据连续性,容器中元素会移动,相应地数据地址也发生了变化,所以迭代器访问时就会失效出错。
deque:
1、deque容器与vector容器相似,都是动态内存管理;
2、与vector容器相比,deque容器支持两端增删元素;
3、与vector容器相比,不支持vector容器的reserve、capacity、data,新增了pop_front(), push_front(), 用于从队列首部弹出与插入元素的方法;

array:
1、array容器大小固定,不允许增删容器元素;
  1. 简述关联容器中各个容器的特点。
    关联容器,都是以二叉树作为内部数据结构,可实现高效查找元素,但是不可以进行任意位置的操作。
set与multiset:
1、二者都是集合(区别在于对于重复元素的允许。前者允许,后者拒绝);
2、二者要求存储的数据类型一致;
3、二者都支持增删查,对于修改,不可以直接进行修改(因为二叉树中元素变动,必须自动排序),若需要修改元素,必须要先查找到原元素,删除原先元素,再进行新增新元素,新元素会被放置到一个自动排序的位子。
map与multimap:
1、二者都是映射,类似于字典;
2、前者映射,不允许存在重复的键值元素对,然后,后者映射,允许重复的键值元素对。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值