STL容器之關(guān)聯(lián)容器
STL是C++的一個類庫。STL中的容器有隊列容器和關(guān)聯(lián)容器,容器適配器(congtainer adapters:stack,queue,priority queue),位集(bit_set),串包(string_package)等等。
在系列中,我將介紹list,vector,deque等隊列容器,和set和multisets,map和multimaps等關(guān)聯(lián)容器,一共7種基本容器類。
隊列容器(順序容器):隊列容器按照線性排列來存儲T類型值的集合,隊列的每個成員都有自己的特有的位置。順序容器有向量類型、雙端隊列類型、列表類型三種。
下面介紹關(guān)聯(lián)容器類。
集和多集(set 和multiset 容器類):
一個集合(#include<set>)是一個容器,它其中所包含的元素的值是唯一的。這在收集一個數(shù)據(jù)的具體值的時候是有用的。集合中的元素按一定的順序排列,并被作為集合中的實(shí)例。如果你需要一個鍵/值對(pair)來存儲數(shù)據(jù),map(也是一個關(guān)聯(lián)容器,后面將馬上要講到)是一個更好的選擇。一個集合通過一個鏈表來組織,在插入操作和刪除操作上比向量(vector)快,但查找或添加末尾的元素時會有些慢。
在集中,所有的成員都是排列好的。
如果先后往一個集中插入:12,2,3,123,5,65
則輸出該集時為:2,3,5,12,65,123
集和多集的區(qū)別是:set支持唯一鍵值,set中的值都是特定的,而且只出現(xiàn)一次;而multiset中可以出現(xiàn)副本鍵,同一值可以出現(xiàn)多次。
Set和multiset的模板參數(shù):
- template<class key, class compare, class Allocator=allocator>
 
第一個參數(shù)key是所存儲的鍵的類型,第二個參數(shù)是為排序值而定義的比較函數(shù)的類型,第三個參數(shù)是被實(shí)現(xiàn)的存儲分配符的類型。在有些編譯器的具體實(shí)現(xiàn)中,第三個參數(shù)可以省略。第二個參數(shù)使用了合適形式的迭代器為鍵定義了特定的關(guān)系操作符,并用來在容器中遍歷值時建立順序。集的迭代器是雙向,同時也是常量的,所以迭代器在使用的時候不能修改元素的值。
Set定義了三個構(gòu)造函數(shù):
默認(rèn)構(gòu)造函數(shù):
- explicit set(const Compare&=compare());
 
如:
- set<int,less<int> > set1;
 
less<int>是一個標(biāo)準(zhǔn)類,用于形成降序排列函數(shù)對象。升序排列是用greater<int>。通過指定某一預(yù)先定義的區(qū)間來初始化set對象的構(gòu)造函數(shù):
- template<class InputIterator> set(InputIterator, InputIterator,\ const Compare&=compare());
 
如:
- set<int ,less<int> >set2(vector1.begin(),vector1.end());
 
復(fù)制構(gòu)造函數(shù):
- set(const set<Key,Compare&>);
 
如:
- set<int ,less<int> >set3(set2);
 
下面我們來看一個簡單的集和多集的插入例程:
- #include <iostream>
 - #include <set>
 - using namespace std;
 - int main()
 - {
 - set<int> set1;
 - for(int i=0; i<10; ++i)
 - set1.insert(i);
 - for(set<int>::iterator p=set1.begin();p!=set1.end();++p)
 - cout<<*p<<"";
 - if(set1.insert(3).second)//把3插入到set1中
 - //插入成功則set1.insert(3).second返回1,否則返回0
 - //此例中,集中已經(jīng)有3這個元素了,所以插入將失敗
 - cout<<"set insert success";
 - else
 - cout<<"set insert failed";
 - int a[] = {4, 1, 1, 1, 1, 1, 0, 5, 1, 0};
 - multiset<int> A;
 - A.insert(set1.begin(),set1.end());
 - A.insert(a,a+10);
 - cout<<endl;
 - for(multiset<int>::iterator p=A.begin();p!=A.end();++p)
 - cout<<*p<<" ";
 - return 0;
 - }
 
映射和多重映射(map 和multimap)
映射和多重映射(#include<map>)基于某一類型Key的鍵集的存在,提供對T類型的數(shù)據(jù)進(jìn)行快速和高效的檢索。對map而言,鍵只是指存儲在容器中的某一成員。Map不支持副本鍵,multimap支持副本鍵。Map和multimap對象包涵了鍵和各個鍵有關(guān)的值,鍵和值的數(shù)據(jù)類型是不相同的,這與set不同。
set中的key和value是Key類型的,而map中的key和value是一個pair結(jié)構(gòu)中的兩個分量。Map支持下表運(yùn)算符operator[],用訪問普通數(shù)組的方式訪問map,不過下標(biāo)為map的鍵。在multimap中一個鍵可以對應(yīng)多個不同的值。
下面的例程說明了map中鍵與值的關(guān)系。
- #include <iostream>
 - #include <map>
 - using namespace std;
 - int main()
 - {
 - map<char,int,less<char> > map1;
 - map<char,int,less<char> >::iterator mapIter;
 - //char 是鍵的類型,int是值的類型
 - //下面是初始化,與數(shù)組類似
 - //也可以用map1.insert(map<char,int,less<char> >::value_type(''c'',3));
 - map1['c']=3;
 - map1['d']=4;
 - map1['a']=1;
 - map1['b']=2;
 - for(mapIter=map1.begin();mapIter!=map1.end();++mapIter)
 - cout<<" "<<(*mapIter).first<<": "<<(*mapIter).second;
 - //first對應(yīng)定義中的char鍵,second對應(yīng)定義中的int值
 - //檢索對應(yīng)于d鍵的值是這樣做的:
 - map<char,int,less<char> >::const_iterator ptr;
 - ptr=map1.find('d');
 - cout<<'\n'<<" "<<(*ptr).first<<" 鍵對應(yīng)于值:"<<(*ptr).second;
 - return 0;
 - }
 
從以上例程中,我們可以看到map對象的行為和一般數(shù)組的行為類似。Map允許兩個或多個值使用比較操作符。下面我們再看看multimap:
- #include <iostream>
 - #include <map>
 - #include <string>
 - using namespace std;
 - int main()
 - {
 - multimap<string,string,less<string> >mulmap;
 - multimap<string,string,less<string> >::iterator p;
 - //初始化多重映射mulmap:
 - typedef multimap<string,string,less<string> >::value_type vt;
 - typedef string s;
 - mulmap.insert(vt(s("Tom "),s("is a student")));
 - mulmap.insert(vt(s("Tom "),s("is a boy")));
 - mulmap.insert(vt(s("Tom "),s("is a bad boy of blue!")));
 - mulmap.insert(vt(s("Jerry "),s("is a student")));
 - mulmap.insert(vt(s("Jerry "),s("is a beatutiful girl")));
 - mulmap.insert(vt(s("DJ "),s("is a student")));
 - //輸出初始化以后的多重映射mulmap:
 - for(p=mulmap.begin();p!=mulmap.end();++p)
 - cout<<(*p).first<<(*p).second<<endl;
 - //檢索并輸出Jerry鍵所對應(yīng)的所有的值
 - cout<<"find Jerry :"<<endl;
 - p=mulmap.find(s("Jerry "));
 - while((*p).first=="Jerry ")
 - {
 - cout<<(*p).first<<(*p).second<<endl;
 - ++p;
 - }
 - return 0;
 - }
 
在map中是不允許一個鍵對應(yīng)多個值的,在multimap中,不支持operator[],也就是說不支持map中允許的下標(biāo)操作。
以上,我們學(xué)習(xí)的是關(guān)聯(lián)容器類set和multisets,map和multimaps,希望對你有幫助。















 
 
 








 
 
 
 