Reference:
- 明日科技 《零基础学 C++》
关联式容器(associative)是 STL 提供的容器的一种,其中的元素都是经过排序的,它主要通过关键字的方式来提高查询的效率。关联式容器包括 set、multiset、map、multimap 和 hash table。
1. set 类模板
set 类模板又称为集合类模板,一个集合对象像链表一样顺序地存储一组值。在一个集合中,集合元素既充当存储的数据,又充当数据的关键码。 可以使用下面的几种方法来创建 set 对象:
- std::set<type,predicate> name:该方法创建了一个名为 name,并包含 type 类型数据的 set 空对象,该对象使用谓词所指定的函数来对集合中的元素进行排序。例如,要给整数创建一个空 set 对象,可以这样写:
std::set<int,std::less<int> > intset; // 注意,less<int> 表达式后要用空格
- std::set<type,predicate> name(myset):该方法使用了复制构造函数,从一个已存在的集合 myset 中生成一个 set 对象;
- std::set<type,predicate> name(first,last):该方法从一定范围的元素中根据多重指示器所指示的起始与终止位置创建一个集合。
1.1 set 对象主要成员函数及说明
函数 | 说明 |
---|
begin | 返回指向集合中第一个元素的迭代器 | clear | 删除集合中所有元素 | cout(x) | 返回集合中值为 x (0 或 1) 的元素个数 | empty | 如果集合为空,则返回 true 值 | end | 返回指向集合中最后一个元素的迭代器 | equal_range(x) | 返回表示 x 下界和上界的两个迭代器,下界表示集合中第一个值等于 x 的元素,上界表示第一个值大于 x 的元素 | erase(start,end) | 删除迭代器 start 和 end 所辖范围内的集合元素 | erase(i) | 删除由迭代器 i 所指向的集合元素 | erase(x) | 删除集合中值为 x 的元素 | find(x) | 返回一个指向 x 的迭代器。如果 x 不存在,返回的迭代器等于 end | insert(i,x) | 把值 x 插入集合。x 的插入位置从迭代器 i 所指明的元素处开始查找 | insert(start,end) | 把迭代器 start 和 end 所指范围内的值插入集合中 | insert(x) | 把 x 插入集合 | lower_bound(x) | 返回一个迭代器,指向位于 x 之前且紧邻 x 的元素 | max_size | 返回集合的最大容量(最多可以容纳的元素个数) | rbegin | 返回一个反向迭代器,指向集合的最后一个元素 | rend | 返回一个反向迭代器,指向集合的第一个元素 | size | 返回集合的大小 | swap(set) | 交换两个集合的内容 | upper_bound(x) | 返回一个指向 x 的迭代器 | value_comp | 返回 value_compare 类型的对象,该对象用于判断集合中元素的先后次序 |
2. multiset 类模板
multiset 使程序能顺序存储一组数据。与集合类类似,多重集合的元素既可以作为存储的数据又可以作为数据的关键字。然而,与集合类不同的是多重集合类可以包含重复的数据。下面列出了几个创建多重集合的语句:
- std::multiset <type,predicate> name:该方法创建了一个名为 name,并包含 type 类型数据的 multiset 空对象,该对象使用谓词所指定的函数来对集合中的元素进行排序。例如,要给整数创建一个空 multiset 对象,可以这样写:
std::multiset <int,std::less<int> > intset; // 注意,less<int> 表达式后要用空格
- std::multiset <type,predicate> name(mymultiset):该方法使用了复制构造函数,从一个已存在的集合 mymultiset 中生成一个 multiset 对象;
- std::multiset <type,predicate> name(first,last):该方法从一定范围的元素中根据指示器所指示的起始与终止位置创建一个集合。
2.1 multiset 对象主要成员函数及说明
函数 | 说明 |
---|
begin | 返回指向集合中第一个元素的迭代器 | clear | 删除集合中所有元素 | cout(x) | 返回集合中值为 x (0 或 1) 的元素个数 | empty | 如果集合为空,则返回 true 值 | end | 返回指向集合中最后一个元素的迭代器 | equal_range(x) | 返回表示 x 下界和上界的两个迭代器,下界表示集合中第一个值等于 x 的元素,上界表示第一个值大于 x 的元素 | erase(start,end) | 删除迭代器 start 和 end 所辖范围内的集合元素 | erase(i) | 删除由迭代器 i 所指向的集合元素 | erase(x) | 删除集合中值为 x 的元素 | find(x) | 返回一个指向 x 的迭代器。如果 x 不存在,返回的迭代器等于 end | insert(i,x) | 把值 x 插入集合。x 的插入位置从迭代器 i 所指明的元素处开始查找 | insert(start,end) | 把迭代器 start 和 end 所指范围内的值插入集合中 | insert(x) | 把 x 插入集合 | lower_bound(x) | 返回一个迭代器,指向位于 x 之前且紧邻 x 的元素 | max_size | 返回集合的最大容量(最多可以容纳的元素个数) | rbegin | 返回一个反向迭代器,指向集合的最后一个元素 | rend | 返回一个反向迭代器,指向集合的第一个元素 | size | 返回集合的大小 | swap(set) | 交换两个集合的内容 | upper_bound(x) | 返回一个指向 x 的迭代器 | value_comp | 返回 value_compare 类型的对象,该对象用于判断集合中元素的先后次序 |
3. map 类模板
map 对象按顺序存储一组值,其中每个元素与一个检索关键码关联。map 与 set 和 multiset 不同,set 和 multiset 中元素既被作为存储的数据又被作为数据的关键值,而 map 类型中元素的数据和关键值是分开的。创建 map 类模板的语法格式如下:
- std::map <key,type,predicate> name:该方法创建了一个名为 name,并包含 type 类型数据的 map 空对象,该对象使用谓词所指定的函数来对集合中的元素进行排序。例如,要给整数创建一个空 map 对象,可以这样写:
std::map <int,int,std::less<int> > intmap; // 注意,less<int> 表达式后要用空格
- std::map <type,type,predicate> name(mymap):该方法使用了复制构造函数,从一个已存在的集合 mymap 中生成一个 map 对象;
- std::map <type,type,predicate> name(first,last):该方法从一定范围的元素中根据多重指示器所指示的起始与终止位置创建一个集合。
3.1 map 对象主要成员函数及说明
函数 | 说明 |
---|
begin | 返回指向集合中第一个元素的迭代器 | clear | 删除集合中所有元素 | empty | 如果集合为空,则返回 true 值 | end | 返回指向集合中最后一个元素的迭代器 | equal_range(x) | 返回表示 x 下界和上界的两个迭代器,下界表示集合中第一个值等于 x 的元素,上界表示第一个值大于 x 的元素 | erase(start,end) | 删除迭代器 start 和 end 所辖范围内的集合元素 | erase(i) | 删除由迭代器 i 所指向的集合元素 | erase(x) | 删除集合中值为 x 的元素 | find(x) | 返回一个指向 x 的迭代器。如果 x 不存在,返回的迭代器等于 end | lower_bound(x) | 返回一个迭代器,指向位于 x 之前且紧邻 x 的元素 | max_size | 返回集合的最大容量(最多可以容纳的元素个数) | rbegin | 返回一个反向迭代器,指向集合的最后一个元素 | rend | 返回一个反向迭代器,指向集合的第一个元素 | size | 返回集合的大小 | swap(set) | 交换两个集合的内容 | upper_bound(x) | 返回一个指向 x 的迭代器 | value_comp | 返回 value_compare 类型的对象,该对象用于判断集合中元素的先后次序 |
4. multimap 类模板
multimap 能够顺序存储一组值,它与 map 相同的是每一个元素都包含一个关键值以及与之联系的数据项,与 map 不同的是多重映射可以包含重复的数据值,并且不能使用 [] 操作符向多重映射中插入元素。构造 multimap 类模板的语句如下:
- std::multimap <key,type,predicate> name:该方法创建了一个名为 name,并包含 type 类型数据的 multimap 空对象,该对象使用谓词所指定的函数来对集合中的元素进行排序。例如,要给整数创建一个空 multimap 对象,可以这样写:
std::multimap <int,int,std::less<int> > intmap; // 注意,less<int> 表达式后要用空格
- std::multimap <type,type,predicate> name(mymap):该方法使用了复制构造函数,从一个已存在的集合 mymap 中生成一个 multimap 对象;
- std::multimap <type,type,predicate> name(first,last):该方法从一定范围的元素中根据多重指示器所指示的起始与终止位置创建一个多重映射。
相关 STL 文章: C++ STL序列容器 C++ STL算法
|