本文主要介绍C++编程语言的STL(Standard Template Library)中set及相关容器的相关知识,同时通过示例代码介绍这些容器的常见用法。
1 概述
关联容器(associative-container)和顺序容器有着根本的不同:关联容器中的元素是按关键字来保存和访问的,而顺序容器中的元素是按它们在容器中的位置来顺序保存和访问的。
虽然关联容器的很多行为与顺序容器相同,但其不同之处反映了关键字的作用。关联容器支持高效的关键字查找和访问。两个主要的关联容器类型为map和set。map中的元素是一些关键字-值(key-value)对:“关键字”起索引的作用,“值”则表示与索引相关联的数据。set中每个元素只包含一个关键字。
2 set
2.1 特性
set的特性如下:
- 存储顺序:按顺序(默认为升序)存储元素;
- 值的特点:所有元素值都是唯一的;
- 底层数据结构:使用二叉搜索树(BST)实现。
2.2 常见用法
2.2.1 构造set
构造set的方法如下(以元素为int类型为例):
set<int> s;
2.2.2 插入元素
向set中插入元素的方法如下:
int i = 1;
s.insert(i);
2.2.3 查看元素出现的次数
查询某元素在set中出现的次数,方法如下(返回0或1):
s.count(i);
2.2.4 使用end()获取最后一个元素
通过end()函数获取set中最后一个元素的方法如下:
auto j = --s.end();
说明:由于end()函数是指向set最后一个元素的下一个位置,因此,需要通过自减符“--”来获取set的最后一个元素。
2.2.5 清空set
通过clear函数可以清空set中的所有元素:
s.clear();
3 multiset
3.1 特性
multiset的特性如下:
- 存储顺序:按顺序(默认为升序)存储元素;
- 值的特点:元素值可以重复出现;
- 底层数据结构:使用二叉搜索树(BST)实现。
3.2 常见用法
3.2.1 构造set
构造multiset的方法如下(以元素为int类型为例):
multiset<int> s;
3.2.2 插入元素
向multiset中插入元素的方法如下:
int i = 1;
s.insert(i);
3.2.3 查看元素出现的次数
查询某元素在multiset中出现的次数,方法如下:
s.count(i);
3.2.4 判断容器是否为空
判断multiset是否为空的方法如下:
s.empty();
4 unordered_multiset
4.1 特性
- 关键字可以重复;
- 无序存储元素;
- 使用哈希表(Hash Table)作为底层数据结构。
4.2 常见用法
4.2.1 构造set
构造unordered_multiset的方法如下(以元素为int类型为例):
unordered_multiset<int> s;
3.2.2 插入元素
向unordered_multiset中插入元素的方法如下:
int i = 1;
s.insert(i);
3.2.3 查看元素出现的次数
查询某元素在unordered_multiset中出现的次数,方法如下(返回元素实际出现次数):
s.count(i);
4 unordered_set
4.1 特性
unordered_set的特性如下:
- 所有元素值都是唯一的;
- 无序存储元素;
- 使用哈希表(Hash Table)作为底层数据结构。
4.2 常见用法
参考set常见用法。