13.3 使用关联式容器

    关联式容器(Associative)又称“联合容器”,将值(value)和关键字(keyword)成对关联。举例来说,在学生管理系统设计时,可以将学号作为关键字起到索引的目的,而将学生姓名、性别和籍贯等信息作为值与学号配对。

    标准STL提供了4种联合容器类模板,即set、map、multiset和multimap。总体来说set中仅仅包含关键字,而没有值的概念;map中存储的是“关键字-值”对,map和set中不会出现多个相同的关键字,即multiset和multimap可以分别看做对set和map的扩展,在multiset和multimap中允许相同关键字的存在。4种关联式容器都会根据指定的或默认的顺序排列函数,以关键字为索引对其中的元素进行排序。

    13.3.1 set容器

    要使用set,必须使用头文件包含命令“#include<set>”,同前面介绍的序列式容器vector、deque和list相似,set也要使用模板参数来提供要存储的值的类型,如下所示。


    set<存储类型[,排序函数或对象]>容器对象名;

    第1个模板类型参数用以指定存储类型,而可选的第2个模板类型参数用来指定对关键字进行排序的函数或函数对象,关于函数对象在本章稍后的内容中会有介绍。在默认情况下,将使用less<>模板,字面意义上可理解为按从小到大进行排列。

    根据set的特点,STL提供了3种创建set的方式,如下所述。

    ❑创建空set容器对象,如下所示。


    set<int>obS;❑将迭代器的区间作为参数的构造函数,如下所示。 int sz[9]={1,2,3,4,5,6,3,5,6}; set<int>A(sz,sz+9);❑根据已有同类型的容器创建新容器,如下所示。 set<int>B(A);

    set不支持随机访问方式,必须通过迭代器方式对set容器对象中的元素进行访问,如示例代码13.7所示。

    代码13.7 set容器对象的创建和元素访问CreateAndSetContainer


    <———————————-文件名:example1307.cpp———————————————> 01 #include<iostream> 02 #include<set>//使用set必须包括此头文件 03 using namespace std; 04 int main() 05 { 06 int sz[9]={2,1,3,5,4,6,3,5,6};//定义int型数组,数组名相当于指针(迭代器) 07 set<int>A(sz,sz+9);//将迭代器区间作为参数创建容器对象A 08 cout<<A. size()<<endl;//输出A中元素个数 09 set<int>:iterator it=A. begin();//创建set<int>:iterator迭代器it,指向A头部 10 while(it!=A. end())//输出全部元素 11 { 12 cout<<(*it)<<""; 13 it++; 14 } 15 cout<<endl; 16 return 0; 17 }

    输出结果如下所示。


    6 1 2 3 4 5 6

    【代码解析】代码第6行语句“set<int>A(sz,sz+9)”采用了9个元素的int型数组创建set<int>型容器对象A,可通过输出“A.size()”发现A中的元素的确只有6个,这符合set的定义,即其中的关键字都是唯一的,与前面相同的元素都会被抛弃,通过从前到后遍历输出A中元素,输出结果为“1 2 3 4 5 6”,可以看出,set自动对关键字进行了排列,采用的是默认的由小到大的顺序,当然,在创建set型对象时,可以自行指定排序方式(第2个模板类型参数)。