文章目录
- 1. 常见的 STL 容器
- 2.vector 和 list 的区别
- 3. vector 的底层原理
- 4. push_back() 和 emplace_back() 区别
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. 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
直接接受一个元素。