STL容器之关联容器

STLC++的一个类库。STL中的容器有队列容器和关联容器,容器适配器(congtainer adapters:stack,queue,priority queue),位集(bit_set),串包(string_package)等等。

10年积累的成都网站建设、做网站经验,可以快速应对客户对网站的新想法和需求。提供各种问题对应的解决方案。让选择我们的客户得到更好、更有力的网络服务。我虽然不认识你,你也不认识我。但先做网站设计后付款的网站建设流程,更有山阳免费网站建设让你可以放心的选择与我们合作。

在系列中,我将介绍list,vector,deque等队列容器,和set和multisets,map和multimaps等关联容器,一共7种基本容器类。

队列容器(顺序容器):队列容器按照线性排列来存储T类型值的集合,队列的每个成员都有自己的特有的位置。顺序容器有向量类型、双端队列类型、列表类型三种。

下面介绍关联容器类。

集和多集(set 和multiset 容器类):

一个集合(#include)是一个容器,它其中所包含的元素的值是唯一的。这在收集一个数据的具体值的时候是有用的。集合中的元素按一定的顺序排列,并被作为集合中的实例。如果你需要一个键/值对(pair)来存储数据,map(也是一个关联容器,后面将马上要讲到)是一个更好的选择。一个集合通过一个链表来组织,在插入操作和删除操作上比向量(vector)快,但查找或添加末尾的元素时会有些慢。

在集中,所有的成员都是排列好的。

如果先后往一个集中插入:12,2,3,123,5,65   

则输出该集时为:2,3,5,12,65,123

集和多集的区别是:set支持唯一键值,set中的值都是特定的,而且只出现一次;而multiset中可以出现副本键,同一值可以出现多次。

Set和multiset的模板参数:

 
 
  1. template 

 

第一个参数key是所存储的键的类型,第二个参数是为排序值而定义的比较函数的类型,第三个参数是被实现的存储分配符的类型。在有些编译器的具体实现中,第三个参数可以省略。第二个参数使用了合适形式的迭代器为键定义了特定的关系操作符,并用来在容器中遍历值时建立顺序。集的迭代器是双向,同时也是常量的,所以迭代器在使用的时候不能修改元素的值。

Set定义了三个构造函数:

默认构造函数:

 
 
  1. explicit set(const Compare&=compare());  

 

如:

 
 
  1. set > set1; 

 

less是一个标准类,用于形成降序排列函数对象。升序排列是用greater。通过指定某一预先定义的区间来初始化set对象的构造函数:

 
 
  1. template set(InputIterator, InputIterator,\ const Compare&=compare()); 

 

如:

 
 
  1. set >set2(vector1.begin(),vector1.end()); 

 

复制构造函数:

 
 
  1. set(const set);  

 

如:

 
 
  1. set >set3(set2);  

 

下面我们来看一个简单的集和多集的插入例程:

 
 
  1. #include   
  2. #include   
  3. using namespace std;  
  4. int main()  
  5. {  
  6. set set1;  
  7. for(int i=0; i<10; ++i)  
  8. set1.insert(i);  
  9. for(set::iterator p=set1.begin();p!=set1.end();++p)  
  10. cout<<*p<<"";  
  11. if(set1.insert(3).second)//把3插入到set1中  
  12. //插入成功则set1.insert(3).second返回1,否则返回0  
  13. //此例中,集中已经有3这个元素了,所以插入将失败  
  14. cout<<"set insert success";  
  15. else 
  16. cout<<"set insert failed";   
  17. int a[] = {4, 1, 1, 1, 1, 1, 0, 5, 1, 0};  
  18. multiset A;  
  19. A.insert(set1.begin(),set1.end());  
  20. A.insert(a,a+10);  
  21. cout<
  22. for(multiset::iterator p=A.begin();p!=A.end();++p)  
  23. cout<<*p<<" ";   
  24. return 0;  

映射和多重映射(map 和multimap)

映射和多重映射(#include)基于某一类型Key的键集的存在,提供对T类型的数据进行快速和高效的检索。对map而言,键只是指存储在容器中的某一成员。Map不支持副本键,multimap支持副本键。Map和multimap对象包涵了键和各个键有关的值,键和值的数据类型是不相同的,这与set不同。

set中的key和value是Key类型的,而map中的key和value是一个pair结构中的两个分量。Map支持下表运算符operator[],用访问普通数组的方式访问map,不过下标为map的键。在multimap中一个键可以对应多个不同的值。

下面的例程说明了map中键与值的关系。

 
 
  1. #include   
  2. #include   
  3. using namespace std;  
  4. int main()  
  5. {  
  6. map > map1;  
  7. map >::iterator mapIter;  
  8. //char 是键的类型,int是值的类型  
  9. //下面是初始化,与数组类似  
  10. //也可以用map1.insert(map >::value_type(''c'',3));   
  11. map1['c']=3;  
  12. map1['d']=4;   
  13. map1['a']=1;  
  14. map1['b']=2;   
  15. for(mapIter=map1.begin();mapIter!=map1.end();++mapIter)  
  16. cout<<" "<<(*mapIter).first<<": "<<(*mapIter).second;  
  17. //first对应定义中的char键,second对应定义中的int值   
  18. //检索对应于d键的值是这样做的:  
  19. map >::const_iterator ptr;   
  20. ptr=map1.find('d');  
  21. cout<<'\n'<<" "<<(*ptr).first<<" 键对应于值:"<<(*ptr).second;   
  22. return 0;  

 

从以上例程中,我们可以看到map对象的行为和一般数组的行为类似。Map允许两个或多个值使用比较操作符。下面我们再看看multimap:

 
 
  1. #include   
  2. #include   
  3. #include   
  4. using namespace std;  
  5. int main()  
  6. {  
  7. multimap >mulmap;  
  8. multimap >::iterator p;  
  9. //初始化多重映射mulmap:   
  10. typedef multimap >::value_type vt;  
  11. typedef string s;  
  12. mulmap.insert(vt(s("Tom "),s("is a student")));  
  13. mulmap.insert(vt(s("Tom "),s("is a boy")));  
  14. mulmap.insert(vt(s("Tom "),s("is a bad boy of blue!")));  
  15. mulmap.insert(vt(s("Jerry "),s("is a student")));  
  16. mulmap.insert(vt(s("Jerry "),s("is a beatutiful girl")));  
  17. mulmap.insert(vt(s("DJ "),s("is a student")));  
  18. //输出初始化以后的多重映射mulmap:   
  19. for(p=mulmap.begin();p!=mulmap.end();++p)  
  20. cout<<(*p).first<<(*p).second<
  21. //检索并输出Jerry键所对应的所有的值  
  22. cout<<"find Jerry :"<
  23. p=mulmap.find(s("Jerry "));  
  24. while((*p).first=="Jerry ")  
  25. {   
  26. cout<<(*p).first<<(*p).second<
  27. ++p;  
  28. }   
  29. return 0;  
  30. }  

在map中是不允许一个键对应多个值的,在multimap中,不支持operator[],也就是说不支持map中允许的下标操作。

以上,我们学习的是关联容器类set和multisets,map和multimaps,希望对你有帮助。

网页名称:STL容器之关联容器
转载来于:http://www.csdahua.cn/qtweb/news37/482687.html

网站建设、网络推广公司-快上网,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 快上网