三、关联容器
关联容器与序列容器有着根本性的不同,序列容器的元素是按照在容器中的位置来顺序保存和访问的,而关联容器的元素是按关键元素来保存和访问的。关联容器支持高效的关键字查找与访问。两个主要的关联容器类型是map与set。
1.set
1.1 简介:set里面每个元素只存有一个key,它支持高效的关键字查询操作。set对应数学中的“集合”。
1.2 特点:
- 储存同一类型的数据元素(这点和vector、queue等其他容器相同)
- 每个元素的值都唯一(没有重复的元素)
- 根据元素的值自动排列大小(有序性)
- 无法直接修改元素
- 高效的插入删除操作
1.3 声明:set<T> a
set<int> a;
1.4 常用函数
以下设 set<T> a,其中a是T类型的set容器。
表达式 |
返回类型 |
说明 |
a.begin() |
返回指向第一个元素的迭代器 |
|
a.end() |
返回指向超尾的迭代器 |
|
a.clear() |
清空容器a |
|
a.empty() |
判断容器是否为空 |
|
a.size() |
返回当前容器元素个数 |
|
a.count(x) |
返回容器a中元素x的个数 |
1.6 插入元素:
- a.insert(x) :其中a为set<T>型容器,x为T型变量
set<int> a={0,1,2,9};
a.insert(6);
for(auto it = a.begin();it != a.end();it++) cout << *it;//输出01269
- a.insert(first,second):其中first为指向区间左侧的迭代器,second为指向右侧的迭代器。作用是将first到second区间内元素插入到a(左闭右开)。
set<int> a = {0,1,2,9};
set<int> b = {3,4,5};
auto first = b.begin();
auto second = b.end();
a.insert(first,second);
for(auto it = a.begin();it != a.end();it++) cout << *it;
插入元素会自动插入到合适的位置,使整个集合有序
1.7 删除元素:
- a.erase(x):删除建值为x的元素
- a.erase(first,second):删除first到second区间内的元素(左闭右开)
- a.erase(iterator):删除迭代器指向的元素
- set中的删除操作是不进行任何的错误检查的,比如定位器的是否合法等等,所以用的时候自己一定要注意。
1.8 lower_bound 和 upper_bound 迭代器:
- lower_bound(x1):返回第一个大于等于键参数x1的元素的迭代器
- upper_bound(x2):返回第一个大于键参数x2的元素的迭代器
- 由以上俩个函数,可以得到一个目标区间,即包含集合中从'x1'到'x2'的所有元素