什么是联合容器
扫描二维码
随时随地手机看文章
1、联合容器(associative container)
---- 对容器概念的另一种改进,联合容器将值与关键字关联在一起,使用关键字来查找值。
key:工号; value:姓名,地址等。对于容器X,表达式X::value_type通常指出了存储在容器中的值的类型。对于联合容器来说,表达式X::key_value指出了用作关键字的类型。
---- 联合容器的长处在于:它提供了对元素的快速访问。允许插入新元素,但是不能指定元素的插入位置。原因是联合容器通常包含用于确定数据放置位置的算法,以便能够很快检索信息。
---- STL提供了4种联合容器:set、multiset、map和multimap
set:其值的类型和关键字相同,关键字是唯一的,集合中不会有多个相同的关键字。
multiset:类似于set,可能有多个值的关键字相同。
map:值的类型与关键字不同,关键字是唯一的,每个关键字只对应一个值。
multimap:与map相似,只是一个关键字可以与多个值关联。
---- 数学为集合定义了一些标准操作,包含#include
例如:set_union()并集包含两个集合合并后的内容。如果两个集合中包含相同的值,则这个值将在并集中只出现一次,因为关键字是唯一的。set_union()函数接受5个迭代器参数。前两个迭代器定义了一个集合的区间,接下来的两个定义了第二个集合的区间,最后一个迭代器是输出迭代器,指出将结果集合复制到什么位置。
set_intersection() 交集包含两个集合公有的元素。
set_difference() 两个集合的差是第一个集合减去两个集合公有的元素。
lower_bound() 将关键字作为参数并返回一个迭代器,该迭代器指向集合中第一个不小于关键字参数的成员。
注:函数lower_bound()在first(0)和last(max_index)中的前闭后开区间进行二分查找,返回大于或等于val的第一个元素位置。如果所有元素都小于val,则返回last的位置。例如,一个数组序列7 9 12 15 18. 设要插入数字2 10 17,pos为要插入的位置的下标:分别为0 2 4,插入后为:2 7 9 10 12 15 17 18
upper_bound() 将关键字作为参数并返回一个迭代器,该迭代器指向集合中第一个大于关键字参数的成员。
#include#include#include#include#includeusing namespace std; int main() { const int N = 6; string s1[N] = {"desk","cup","paper","bottle","cup","chair"}; string s2[N] = {"apple","pair","orange","paper","bread","rice"}; setA(s1,s1+N); setB(s2,s2+N); ostream_iteratorout(cout," "); cout<<"Set A:"; copy(A.begin(),A.end(),out); cout<<endl<<"Set B:"; copy(B.begin(),B.end(),out); cout<<endl<<"Union of A and B:n"; set_union(A.begin(),A.end(),B.begin(),B.end(),out);//algorithm cout<<endl<<"Intersection of A and B:n"; set_intersection(A.begin(),A.end(),B.begin(),B.end(),out); cout<<endl<<"Difference of A and B:n"; set_difference(A.begin(),A.end(),B.begin(),B.end(),out); cout<<endl; setC; cout<<"Set C:n"; set_union(A.begin(),A.end(),B.begin(),B.end(),insert_iterator<set> (C,C.begin())); copy(C.begin(),C.end(),out); cout<<endl; string s3("grangy"); C.insert(s3); cout<<"Set C after insertion:n"; copy(C.begin(),C.end(),out); cout<<endl<<"Showing a range:n"; copy(C.lower_bound("cup"),C.upper_bound("paper"),out); system("pause"); return 0; }
输出:
2、multimap范例
---- 与set相似,multimap也是可反转的、经过排序的联合容器,但在multimap中,关键字的类型与值类型不同,在multimap对象
中,特定的关键字可能与多个值相关联。基本的multimap声明使用模板参数指定了关键字的类型和所存储的值的类型。
multimapname;//创建了一个multimap对象,其中关键字的类型为int,所存储的值的类型为string
为将信息结合在一起,实际的值类型将关键字类型和数据类型结合为一对。为此,STL使用pair