目录
序列式容器与关联式容器
序列式容器和关联式容器是C++标准模板库(STL)中的两大类容器
序列式容器
序列式容器存储的元素在逻辑上呈现为线性序列。这些容器的共同特点是,它们允许通过位置(索引)来访问元素,且元素之间的相对位置是固定的,除非进行插入或删除操作。常见的序列式容器包括:
-
vector:一个动态数组,支持随机访问,但在中间插入或删除元素时可能需要移动大量元素。
-
deque(双端队列):一个支持在两端高效插入和删除的动态数组。它提供了随机访问功能,但与vector相比,在两端进行操作时性能更优。
-
list:一个双向链表,不支持随机访问,但在任意位置插入和删除元素时性能较好。
-
forward_list:一个单向链表,与list相比,它只支持向前遍历,但内存开销更小。
-
array:一个固定大小的数组,不支持动态调整大小,但提供了与vector类似的随机访问性能。
关联式容器
关联式容器存储的元素是按关键字(key)组织起来的,这些关键字用于快速查找、插入和删除元素。关联式容器通常基于平衡二叉树(如红黑树)或哈希表实现。常见的关联式容器包括:
-
map:一个关联数组,存储键值对(key-value pairs),其中每个键都是唯一的。map中的元素按键的升序排列(默认情况下,可以通过提供自定义比较函数来改变排序规则)。
-
set:一个元素集合,其中每个元素都是唯一的。set中的元素按升序排列(同样可以通过提供自定义比较函数来改变排序规则)。
-
unordered_map:一个基于哈希表的关联数组,存储键值对,其中键不需要唯一(但通常在实际使用中保持唯一以避免未定义行为),且不支持按键排序。查找、插入和删除操作的时间复杂度平均为O(1)。
-
unordered_set:一个基于哈希表的元素集合,其中每个元素都是唯一的,且不支持排序。查找、插入和删除操作的时间复杂度平均为O(1)。
区别
- 访问方式:序列式容器主要通过位置(索引)访问元素,而关联式容器主要通过关键字访问元素。
- 有序性:默认情况下,map和set中的元素按键的升序排列,而unordered_map和unordered_set中的元素则无序。
- 性能:在序列式容器中,随机访问(如vector)通常很快,但在中间插入或删除元素可能较慢。在关联式容器中,查找、插入和删除操作的时间复杂度通常为O(log n)(对于基于红黑树的容器)或O(1)(对于基于哈希表的容器)。
- 内存使用:序列式容器(如vector)在连续内存中存储元素,通常具有较低的内存碎片。而关联式容器(特别是基于哈希表的容器)可能由于哈希冲突和动态调整大小而导致较高的内存开销。
关联式容器:map和set
map
- 定义:map是一个关联容器,它存储的是键值对(key-value pairs)。
- 特性:
- map中的元素按键的升序排列(默认情况下,可以通过自定义比较函数来改变排序规则)。
- key在map中是唯一的。
- 每个元素都是一个pair,其第一个元素是key(键),第二个元素是value(值)。
set
- 定义:set是一个关联容器,它存储的是唯一的元素(即key)。
- 特性:
- set中的元素是唯一的。
- set中的元素按升序排列(默认情况下,同样可以通过自定义比较函数来改变排序规则)。
set的使用
set类
- set的声明需要T(也就是关键字Key的类型)
- set默认T排序支持小于排序,也可以写仿函数自行提供排序方式
- set的储存数据内存是从空间配置器来申请,也可以自己实现内存池
- set的第二个和第三个模板参数一般不需要自己填写
- set的底层是红黑树,增删查改效率为O(logN),是有序的,迭代器走的是中序
template < class T, // key类型T
class Compare = less<T>, // Compare的比较仿函数
class Alloc = allocator<T> // 内存池
> class set;
set的构造与迭代器
- set的构造与之的STL构造一样
- set的迭代器支持正向和反向迭代器,遍历默认升序
- 支持范围for
- 迭代器不支持修改数数据,不能修改key
//empty (1) 无参构造
explicit set (const key_compare& comp = key_compare(),
const allocator_type& alloc = allocator_type());
//range (2) 迭代器区间构造
template <class InputIterator>
set (InputIterator first, InputIterator last,
const key_compare& comp = key_compare(),
const allocator_type& alloc = allocator_type());
//copy (3) 拷贝构造
set (const set& x);
//这里还有一个移动构造 移动构造函数我会但开一篇
//初始化器列表 (5)
set (initializer_list<value_type> il,
const key_compare& comp = key_compare(),
const allocator_type& alloc = allocator_type());
//迭代器 双向迭代器
iterator a bidirectional iterator to const value_type
//const

最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



