Containers
简介
容器是用来存储数据的序列,每个容器都作为模板类实现。不同的容器提供了不同的存储方式和访问模式。一般分为 4 种类型:
-
序列容器:是指那些在容器中按顺序存放元素的容器类。
std::array
是一种固定大小的数组容器,与 C 语言中的数组相比,具有更好的类型安全和内存管理特性。支持快速随机访问std::vector
是一种连续存储动态数组,可以在运行时根据需要动态调整大小。自动管理内存,不需要手动分配和释放。支持快速随机访问std::deque
全称是 double-ended queue ,是一个动态数组,它提供了快速的随机访问能力,同时允许在两端进行高效的插入和删除操作std::list
将数据存储在非连续内存中。容器中的每个元素都通过指针指向前一个元素和后一个元素,称为双向链表。链表只提供了从第一个元素或最后一个元素访问容器的方法——即不支持元素的随机访问。std::forward_list
也像list
一样以顺序方式存储数据,但不同之处在于forward_list
仅存储序列中下一个元素的位置。它实现了单向链表
-
关联容器:会在新元素插入时自动排序,可实现快速搜索
std::set
:是一种用于存储唯一元素的有序集合,底层使用红黑树实现std::multiset
:是一种允许重复元素的有序集合std::map
:是一种有序的键值对容器,按键排序,且键是唯一的。这使得它非常适合需要快速查找、插入和删除的场景std::multimap
:键值对的有序集合,允许重复的键
-
无序关联容器:实现可快速搜索的未排序(哈希)数据结构
std::unordered_set
:无序集合std::unordered_multiset
:无序多重集合std::unordered_map
:无序映射std::unordered_multimap
:无序多重映射
-
容器适配器:用于将一种容器或适配成另一种容器
std::stack
是一种后进先出的数据结构,容器内的元素是线性排列的,但只允许在一端(栈顶)进行添加和移除操作std::queue
是一种先进先出的数据结构,它允许在一端添加元素(称为队尾),并在另一端移除元素(称为队首)。std::priority_queue
vector
vector 是一种连续存储动态数组,可以在运行时根据需要动态调整大小。自动管理内存,不需要手动分配和释放。
|
vector 可通过多种方式进行初始化
Constructor | Description |
---|---|
vector() |
创建一个空的容器 |
vector(n) |
创建一个包含 n 个默认值元素的容器 |
vector(n, value) |
创建一个包含 n 个值为 value 的容器 |
vector(il) |
使用初始化列表 il 构造容器 |
// Creating an empty vector |
以下是 std::vector
的一些常用成员函数:
Function | Description |
---|---|
operator[pos] |
返回指定位置的元素,不带边界检查 |
at(pos) |
返回指定位置的元素,带边界检查 |
front() |
返回第一个元素 |
back() |
返回最后一个元素 |
data() |
返回指向底层数组的指针 |
size() |
返回当前元素数量 |
capacity() |
返回当前分配的容量 |
reserve(n) |
预留至少 n 个元素的存储空间 |
resize(n) |
更改向量的大小 |
empty() |
检查向量是否为空 |
clear() |
清空所有元素 |
insert(pos_iter, val) insert(pos_iter, n, val) insert(pos_iter, first, last) |
在指定位置插入元素 |
erase(pos_iter) erase(first, last) |
删除指定位置或范围的元素 |
push_back(val) |
在末尾添加元素 |
pop_back() |
删除末尾元素 |
begin() / end() |
返回指向向量的第一个/最后一个元素的迭代器 |
|
list
list
将数据存储在非连续内存中。容器中的每个元素都通过指针指向前一个元素和后一个元素,称为双向链表。链表只提供了从第一个元素或最后一个元素访问容器的方法——即不支持元素的随机访问。
|
list 和 vector一样,可通过多种方式进行初始化。
以下是 std::list
的一些常用的成员函数:
Function | Description |
---|---|
push_back(val) |
在链表末尾添加元素 |
push_front(val) |
在链表头部添加元素 |
pop_back() |
删除链表末尾的元素 |
pop_front() |
删除链表头部的元素 |
insert(pos_iter, val) insert(pos_iter, n, val) insert(pos_iter, first, last) |
在指定位置插入元素 |
erase(pos_iter) erase(first, last) |
删除指定位置或范围的元素 |
clear() |
清空所有元素 |
size() |
返回链表中的元素数量 |
empty() |
检查链表是否为空 |
front() |
返回链表第一个元素 |
back() |
返回链表最后一个元素 |
remove(val) |
删除所有等于指定值的元素 |
sort() |
对链表中的元素进行排序 |
merge(other) |
合并另一个已排序的链表 |
reverse() |
反转链表 |
begin() / end() |
返回容器的起始/结束迭代器 |
|
合并两个已排序的链表
|
set
set
是一种用于存储唯一元素的有序集合,特别适合需要快速查找、插入和删除操作的场景。
|
以下是 std::list
的一些常用的成员函数:
Function | Description |
---|---|
insert(val) insert(first, last) insert({val1,val2,...}) |
插入元素 |
emplace(val) |
将新元素插入容器中 |
erase(val) erase(pos_iter) erase(first, last) |
删除指定位置或范围的元素 |
clear() |
清空所有元素 |
size() |
返回容器中的元素数量 |
empty() |
检查容器是否为空 |
find(key) |
查找集合中的元素 |
contains(key) |
查看元素是否存在 |
count(key) |
返回指定元素的计数 |
merge(other) |
将一个 Set 合并到另一个 Set |
equal_range(key) |
|
upper_bound(key) |
大于key的第一个元素的迭代器 |
lower_bound(key) |
小于key的第一个元素的迭代器 |
begin() / end() |
返回容器的起始/结束迭代器 |
我们不能像 vector 中那样按索引访问集合的元素。在 set 中,我们必须分别递增或递减从 begin()
或 end()
方法获取的迭代器,才能按位置访问元素。也可以在 next()
或 advance()
函数的帮助下完成。
|
元素的插入
|
查找指定值是否存在
|
map
map
是一种有序的键值对容器,容器中的元素是按照键的顺序自动排序的,这使得它非常适合需要快速查找和有序数据的场景。
|
声明和初始化 map 的不同方法
|
以下是 std::map
的一些常用成员函数:
Function | Description |
---|---|
operator[key] |
返回或修改指定key的元素 |
at(key) |
返回或修改指定key的元素,带边界检查 |
size() |
返回当前元素数量 |
insert({key, val}) insert(first, last) `insert( |
评论