1. 关联式容器概述
在C++标准库中,容器主要分为序列式容器和关联式容器两大类。关联式容器与序列式容器的本质区别在于其底层数据结构和访问方式。关联式容器中的元素并不是按插入顺序存储,而是通过特定的数据结构(通常是红黑树或哈希表)来维护元素之间的关系。
关联式容器的一个重要特性是:容器中元素的位置关系与其存储结构紧密相关。如果随意交换关联式容器中元素的位置,会破坏其底层的数据结构特性。例如在基于红黑树实现的set和map中,元素的位置是由其键值决定的,强行交换元素会导致红黑树的性质被破坏。
2. Set容器深度解析
2.1 Set基础架构
set是C++标准库提供的一种关联式容器,它包含的元素是唯一的,即每个元素只能出现一次。set的内部实现通常采用红黑树(一种自平衡二叉搜索树)作为底层数据结构。
cpp复制template <class Key,
class Compare = less<Key>,
class Allocator = allocator<Key>>
class set;
set的模板参数包括:
- Key:存储在set中的元素类型
- Compare:用于元素比较的仿函数,默认为less
- Allocator:内存分配器类型,默认为allocator
注意:set中的元素不能被直接修改,因为这会破坏红黑树的排序性质。如果需要修改元素,必须先删除旧元素,再插入新元素。
2.2 Set的构造与初始化
set提供了多种构造方式,与STL中的其他容器类似:
cpp复制// 默认构造
set<int> s1;
// 迭代器范围构造
vector<int> v = {1, 2, 3, 4};
set<int> s2(v.begin(), v.end());
// 拷贝构造
set<int> s3(s2);
// 初始化列表构造
set<int> s4 = {1, 2, 3, 4};
初始化列表构造的本质是遍历初始化列表并逐个插入元素,插入过程中会自动去重。例如:
cpp复制set<int> s = {2, 8, 3, 9, 2};
// 实际存储的元素为:2, 3, 8, 9
2.3 Set的基本操作
2.3.1 插入操作
set提供了insert方法用于插入元素:
cpp复制set<int> s;
s.insert(5); // 插入单个元素
s.insert({2, 4, 6}); // 插入初始化列表
insert方法的返回值是一个pair<iterator, bool>,其中:
- first:指向插入元素的迭代器
- second:表示是否插入成功(false表示元素已存在)
2.3.2 删除操作
set提供了erase方法用于删除元素:
cpp复制set<int> s = {
解锁全文
加入我们的会员,获取最新、最热、最精彩的开发者技术内容