成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

STL容器之關聯容器

開發 后端
我們都知道STL是C++中的一個類庫。本文介紹的是STL組件之一的容器中的關聯容器類。希望對你有幫助,一起來看吧!

STLC++的一個類庫。STL中的容器有隊列容器和關聯容器,容器適配器(congtainer adapters:stack,queue,priority queue),位集(bit_set),串包(string_package)等等。

在系列中,我將介紹list,vector,deque等隊列容器,和set和multisets,map和multimaps等關聯容器,一共7種基本容器類。

隊列容器(順序容器):隊列容器按照線性排列來存儲T類型值的集合,隊列的每個成員都有自己的特有的位置。順序容器有向量類型、雙端隊列類型、列表類型三種。

下面介紹關聯容器類。

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

一個集合(#include<set>)是一個容器,它其中所包含的元素的值是唯一的。這在收集一個數據的具體值的時候是有用的。集合中的元素按一定的順序排列,并被作為集合中的實例。如果你需要一個鍵/值對(pair)來存儲數據,map(也是一個關聯容器,后面將馬上要講到)是一個更好的選擇。一個集合通過一個鏈表來組織,在插入操作和刪除操作上比向量(vector)快,但查找或添加末尾的元素時會有些慢。

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

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

則輸出該集時為:2,3,5,12,65,123

集和多集的區別是:set支持唯一鍵值,set中的值都是特定的,而且只出現一次;而multiset中可以出現副本鍵,同一值可以出現多次。

Set和multiset的模板參數:

  1. template<class key, class compare, class Allocator=allocator> 

 

第一個參數key是所存儲的鍵的類型,第二個參數是為排序值而定義的比較函數的類型,第三個參數是被實現的存儲分配符的類型。在有些編譯器的具體實現中,第三個參數可以省略。第二個參數使用了合適形式的迭代器為鍵定義了特定的關系操作符,并用來在容器中遍歷值時建立順序。集的迭代器是雙向,同時也是常量的,所以迭代器在使用的時候不能修改元素的值。

Set定義了三個構造函數:

默認構造函數:

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

 

如:

  1. set<int,less<int> > set1; 

 

less<int>是一個標準類,用于形成降序排列函數對象。升序排列是用greater<int>。通過指定某一預先定義的區間來初始化set對象的構造函數:

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

 

如:

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

 

復制構造函數:

  1. set(const set<Key,Compare&>);  

 

如:

  1. set<int ,less<int> >set3(set2);  

 

下面我們來看一個簡單的集和多集的插入例程:

  1. #include <iostream>  
  2. #include <set>  
  3. using namespace std;  
  4. int main()  
  5. {  
  6. set<int> set1;  
  7. for(int i=0; i<10; ++i)  
  8. set1.insert(i);  
  9. for(set<int>::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<int> A;  
  19. A.insert(set1.begin(),set1.end());  
  20. A.insert(a,a+10);  
  21. cout<<endl;  
  22. for(multiset<int>::iterator p=A.begin();p!=A.end();++p)  
  23. cout<<*p<<" ";   
  24. return 0;  

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

映射和多重映射(#include<map>)基于某一類型Key的鍵集的存在,提供對T類型的數據進行快速和高效的檢索。對map而言,鍵只是指存儲在容器中的某一成員。Map不支持副本鍵,multimap支持副本鍵。Map和multimap對象包涵了鍵和各個鍵有關的值,鍵和值的數據類型是不相同的,這與set不同。

set中的key和value是Key類型的,而map中的key和value是一個pair結構中的兩個分量。Map支持下表運算符operator[],用訪問普通數組的方式訪問map,不過下標為map的鍵。在multimap中一個鍵可以對應多個不同的值。

下面的例程說明了map中鍵與值的關系。

  1. #include <iostream>  
  2. #include <map>  
  3. using namespace std;  
  4. int main()  
  5. {  
  6. map<char,int,less<char> > map1;  
  7. map<char,int,less<char> >::iterator mapIter;  
  8. //char 是鍵的類型,int是值的類型  
  9. //下面是初始化,與數組類似  
  10. //也可以用map1.insert(map<char,int,less<char> >::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<char,int,less<char> >::const_iterator ptr;   
  20. ptr=map1.find('d');  
  21. cout<<'\n'<<" "<<(*ptr).first<<" 鍵對應于值:"<<(*ptr).second;   
  22. return 0;  

 

從以上例程中,我們可以看到map對象的行為和一般數組的行為類似。Map允許兩個或多個值使用比較操作符。下面我們再看看multimap:

  1. #include <iostream>  
  2. #include <map>  
  3. #include <string>  
  4. using namespace std;  
  5. int main()  
  6. {  
  7. multimap<string,string,less<string> >mulmap;  
  8. multimap<string,string,less<string> >::iterator p;  
  9. //初始化多重映射mulmap:   
  10. typedef multimap<string,string,less<string> >::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<<endl;  
  21. //檢索并輸出Jerry鍵所對應的所有的值  
  22. cout<<"find Jerry :"<<endl;  
  23. p=mulmap.find(s("Jerry "));  
  24. while((*p).first=="Jerry ")  
  25. {   
  26. cout<<(*p).first<<(*p).second<<endl;  
  27. ++p;  
  28. }   
  29. return 0;  
  30. }  

在map中是不允許一個鍵對應多個值的,在multimap中,不支持operator[],也就是說不支持map中允許的下標操作。

以上,我們學習的是關聯容器類set和multisets,map和multimaps,希望對你有幫助。

責任編輯:于鐵 來源: 互聯網
相關推薦

2011-07-13 14:49:31

STLC++

2011-07-13 14:58:53

STL容器

2010-01-06 16:25:58

.Net Framew

2023-12-10 22:00:47

STLC++編程

2019-07-11 15:25:02

架構運維技術

2019-12-12 10:58:37

Docker容器引擎

2020-03-04 09:56:56

網絡安全云原生容器

2022-05-30 09:32:07

Spring容器

2020-10-19 09:32:49

容器Docker管理

2020-10-26 15:11:50

Docker容器IT

2021-07-27 10:52:27

iOS WKWebView容器

2009-07-03 16:53:11

Servlet容器

2022-09-06 10:18:39

微型容器鏡像微服務

2012-02-22 14:14:43

Java

2019-09-26 08:59:39

DockerGoogle軟件

2024-03-20 10:46:00

云原生容器

2011-07-13 14:28:09

STL算法

2022-05-30 11:17:44

Spring容器配置

2022-06-09 07:27:14

JavaSpring容器

2022-04-15 15:03:42

云計算容器Linux
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧洲精品一区 | 日韩精品在线免费观看 | 欧美高清视频在线观看 | 综合精品久久久 | 天天搞天天操 | 成人午夜精品 | 亚洲狠狠爱 | 欧美中文字幕在线观看 | 国产精品中文字幕在线播放 | 精品一区免费 | 国产一区二区三区在线 | av影音在线 | 欧美淫| 性色的免费视频 | 国产区精品在线观看 | 国产精品久久久久aaaa | 北条麻妃一区二区三区在线观看 | 亚洲精品乱码久久久久久9色 | 涩爱av一区二区三区 | 亚洲综合网站 | 精品国产一区二区三区性色av | 免费看a | 第一色在线| 精品国产网 | 台湾a级理论片在线观看 | 中文字幕福利视频 | 亚洲成人av | 国产一级一级毛片 | 欧美视频xxx | 国产在线高清 | 91大神新作在线观看 | 亚洲视频免费在线播放 | 国产 欧美 日韩 一区 | 色视频网站 | 久久精品免费一区二区三 | 久久午夜国产精品www忘忧草 | 久久久毛片 | 日本成人在线免费视频 | 国产精品视频 | 在线欧美视频 | 久久精品这里 |