三、关联式容器–有序
标签(空格分隔): c++STL
关联式容器是关联式数组概念的推广
- 依据特定的排序规则,自动为其元素排序
- 由二叉树实现
- 提供对元素的快速访问
主要的有序关联式容器有:
- set:关键字和数据文件是同一个值。具有唯一性
- multiset:类似,但是包含重复的元素
- map: 成对数据的容器。键值对,唯一性
- multimap:类似,可以重复
无序关联容器:
- unordered_map:
- unordered_multimap
- unordered_set
- unordered_multiset
1.set/multiset类模板
1.定义
声明:
template <class Key,class Traits=less<key>,class Allocator= allocator<Key> > class set;
- key: 存储数据类型
- Traits : 实现内部排序的仿函数,默认参数
- Allocator: 内存配置器
说明一下排序规则:
- 反对称的: x<y
为真,则x>y
为假
- 可传递的: x<y
,y<z
为真,则x<z
为真
- 非自反的: 对于operator<
,x<x
永远为假,是不可能的,对于判断式predicate op()而言,op(x,x)永远为假。
因此,在具体实现排序规则的时候:
有两种形式:
- 在模板中以参数形式实现
- 以构造函数参数定义
传递函数对象。
greater<T>
,less<T>
函数对象模板,定义在functional
头文件中
自定义排序规则:
std::set<int,std::greater<int> > s1;//第一种方法
set<int>s2(less<int>()); //第二种方式
初始化:
set<T> s;
set<T> s1(s);
set<T> s ={T1,T2,..} //初始化列表的方法
等等
2.容量
- empty
- size
- max_size
3.迭代器
- begin()和end()
- rbegin()和rend()
4.修改器
赋值:
- emplace 就地构造元素
- insert 插入一个元素
删除:
- erase 删除元素
- clear 删除全部内容
- swap 交换内容
5.查找
- count 返回匹配特定键的元素数量
- find 寻找特定键的元素
- equal_range 返回特定键的元素范围
- lower_bound 返回一个迭代器,指向第一个“不小于”给定值的元素
- upper_bound 类似,返回第一个“大于”给定值的元素
6.查询
- key_comp 返回用于比较键的函数
- value_comp 返回用于在value_type类型的钟祥中比较键的函数
原型:
key_compare key_comp()const;
key_compare value_comp() const;
key_compare 决定集合中的排列顺序。
使用方法:
set<T> s;
set<T>::key_compare func = s.key_comp();
7.非成员函数
- operator==
- operator!=
- operator<
- operator<=
- operator>
- operator>=
例子:
#include <set>
template <typename T>
void printsetvalue( set<T> s){
cout << "set: ";
set<T>::const_iterator it;
for (it = s.begin(); it != s.end(); ++it)
cout << *it << " " ;
cout << endl;
}
int main()
{
set<string> s = {"abd","car","bar","dat","fore","male","dela"};
set<string>::iterator iter;
pair<set<string>::iterator, set<string>::iterator> p;
cout << "--------insert---------" << endl;
s.insert("wa_ha_ha");
s.insert("ma_ma_ma");
printsetvalue(s) ;
cout << "---------equal_range--------" << endl;
p = s.equal_range("dat");
cout << "不小于的第一个值:" << *p.first<< endl;
cout << "大于的第一个值:" << *p.second << endl;
cout << "---------lower_bound 和upper_bound --------" << endl;
iter = s.lower_bound("dat");
cout << "不小于的第一个值:" << *iter<< endl;
iter = s.upper_bound("dat");
cout << "大于的第一个值:" << *iter << endl;
}
输出为:
--------insert---------
set: abd bar car dat dela fore ma_ma_ma male wa_ha_ha
---------equal_range--------
不小于的第一个值:dat
大于的第一个值:dela
---------lower_bound 和upper_bound --------
不小于的第一个值:dat
大于的第一个值:dela
2.map/mutilmap类模板
两个类型基本一致。
1.定义和初始化
构造函数:
构造函数 | 备注 |
---|---|
map c / multimap c | 产生一个空的map或者multimap |
map c(op) /multimap c(op) | 产生一个以op为准则,空的map/multimap |
map c1(c) / multimap c2(c) | 产生c 的副本 |
map c(beg,end) / multimap c(beg,end) | 用迭代器范围产生一个新map/multimap |
map c(beg,end,op) / multimap c(beg,end,op) | 以op为排序规则,用迭代器产生 |
排序形式:
map | 效果 |
---|---|
map<key,Elem> / multimap<key,Elem> | 以less()为排序准则 |
map<key,Elem,op> /multimap<key,Elem,op> | 以op为准则 |
2.元素的访问和容量
元素的访问:
- at() (c++11):不存在,返回out_of_range 异常
- operator[k]:若k不存在,则添加关键字k,并且初始化
容量:
- empty
- size
- max_size
3.迭代器
- begin()和end()
- rbegin()和rend()
4.修改器
赋值:
- emplace
- insert
删除:
- clear
- erase
- swap
5.查找
- count 返回匹配特定键的元素数量
- find 寻找特定键的元素
- equal_range 返回特定键的元素范围
- lower_bound 返回一个迭代器,指向第一个“不小于”给定值的元素
- upper_bound 类似,返回第一个“大于”给定值的元素
6.查询
- key_comp 返回用于比较键的函数
- value_comp 返回用于在value_type类型的钟祥中比较键的函数
7.非成员函数
- operator==
- operator!=
- operator<
- operator<=
- operator>
- operator>=