【C++ 高频面试题】STL 你了解多少呢?vector 的底层实现原理

1. 常见的 STL 容器

  • 🍎①序列容器
    vector(向量):是一个动态数组实现,提供高效的随机访问和在尾部进行插入/删除操作。
    list(链表):是一个双向链表实现,支持在==任意位置进行插入/删除操作,但不支持随机访问。
    在这里插入图片描述

  • 🍎②关联容器
    set(集合):是一个有序的集合,不允许重复元素,支持快速查找、插入、删除。
    在这里插入图片描述

  • 🍎③容器适配器
    stack(栈):是一个基于底层容器的栈实现,满足后进先出的规则。
    queue(队列):是一个基于底层容器队列的实现,满足先进先出的规则。


2.vector 和 list 的区别

  • 🍎vector底层实现是数组,list底层是双向链表
  • 🍎vector是顺序存储,支持随机访问,list不行。
  • 🍎vector 随机访问性好,插入和删除的效率较低;list不支持随机访问,插入和删除效率较高。
  • 🍎vector在中间节点进行插入删除会导致内存拷贝,list不会
  • 🍎vector一次性分配好内存,不够时才进行翻倍扩容list每次插入新的节点都会进行内存申请

3. vector 的底层原理

vector在堆中分配了一段连续的内存空间来存放元素。
三个迭代器
(1)first:对象的起始字节位置
(2)last:指向当前最后一个元素的末尾字节
(3)end:指向整个vector容器所占用内存空间的末尾字节

4. list 的实现原理

std::listC++标准库中的一个双向链表实现,它的实现原理基于链表数据结构。每个节点包含两个指针,分别指向前一个节点和后一个节点,以及存储实际数据的部分。
在这里插入图片描述
std::list维护了一个头指针和尾指针,它们分别指向链表的第一个节点和最后一个节点。在插入和删除操作时,只需要调整相邻的指针,不需要移动整个数据块。

5. push_back() 和 emplace_back() 区别

  • 🐧push_back用于在容器的尾部添加一个元素
container.push_back(value);

container是一个支持push_back操作的容器,例如:std::vector、std::list等,而value是要添加的元素的值。

  • 🐧emplace_back用于在容器的尾部直接构造一个元素
container.emplace_back(value);

其中 container 是⼀个⽀持 emplace_back 操作的容器,⽽ args 是传递给元素类型的构造函数的参数。
push_back 不同的是, emplace_back 不需要创建临时对象,⽽是直接在容器中构造新的元素。


🍎两者的区别
push_back接受一个已存在的对象或一个可转换为容器元素类型的对象,并将其复制或移动到容器中。emplace_back直接在容器中构造元素,不需要创建临时对象

emplace_back通常比push_back更高效,因为它避免了创建和销毁临时对象的开销。

emplace_back的参数是传递给元素类型的构造函数的参数,而push_back直接接受一个元素。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小Jie努力认真找工作

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值