1. Multiset
Multiset是set集合容器的一種,其擁有set的全部內(nèi)容,在此基礎(chǔ)之上,multiset還具備了可以重復(fù)保存元素的功能,因此會有略微和set的差別。
Multise容器在執(zhí)行insert()時(shí),只要數(shù)據(jù)不是非法數(shù)據(jù)和空數(shù)據(jù),insert就總是能夠執(zhí)行,無論時(shí)一個(gè)數(shù)據(jù)還是一段數(shù)據(jù)。
Multiset容器中的find()函數(shù)回返回和參數(shù)匹配的第一個(gè)元素的迭代器,即時(shí)存在多個(gè)元素也只是返回第一個(gè),如{10,20,20,20}搜索20進(jìn)行匹配將會返回第二個(gè)參數(shù),如果沒有符合的參數(shù)則結(jié)束迭代器。
同理諸如lower_bound()等的需要進(jìn)行一個(gè)位置的返回值,則統(tǒng)統(tǒng)返回第一個(gè)發(fā)現(xiàn)的值。
以下是一個(gè)舉例:
#include <iostream> #include <set> #include <algorithm> using namespace std; int main(){ multiset<int> ms; ms.insert(10); ms.insert(20); ms.insert(10); ms.insert(20); ms.insert(30); ms.insert(50); //{10,20,10,20,30,50} -----> {10,10,20,20,30,50} 插入時(shí)即會自動排序 cout<< "發(fā)現(xiàn)20的位置在" << *ms.find(20)<<endl; //這樣是找不出來的喲 int i=0; for(multiset<int>::iterator it=ms.begin();it!=ms.find(20);it++,i++){} cout<< "發(fā)現(xiàn)20的位置在" << i <<endl; //由于是從0開始計(jì)算的因此答案是2 return 0; }
舉例使用find進(jìn)行查詢了集合元素的位置,我們可以發(fā)現(xiàn),這樣使用實(shí)則麻煩而且浪費(fèi)算力,的確,STL中提供的迭代器的思路是:提供一種方法順序訪問一個(gè)聚合對象中各個(gè)元素,而又不需暴露該對象的內(nèi)部表示。
也就是說,我們使用迭代器進(jìn)行訪問的時(shí)候,迭代器是不會告訴你你需要訪問的元素是數(shù)據(jù)內(nèi)部的第幾個(gè)位置,這樣匿名的思路對于工程的設(shè)計(jì)是有幫助的。
2. Multimap容器
Multimap時(shí)map映射容器的一種,其擁有map的全部內(nèi)容,并在此基礎(chǔ)之上,multimap還具有了可以重復(fù)保存元素的功能,與上文的mutliset差不多,任何進(jìn)行訪問單個(gè)值得語句訪問均只會返回第一個(gè)位置,這里不再多說,而是舉一個(gè)實(shí)際中可能用得到得例子。
有沒有一種方法,使得一個(gè)key值能夠?qū)?yīng)多個(gè)value,產(chǎn)生一種諸如一個(gè)學(xué)生有多門考試成績一樣的映射
我們都知道m(xù)ap關(guān)聯(lián)容器是使得一個(gè)數(shù)據(jù)與另一個(gè)數(shù)據(jù)發(fā)生映射的容器,通過key得到value產(chǎn)生一一對應(yīng),那么multimap在此基礎(chǔ)上使得map元素可以重復(fù),因此這種情況可以使用multimap
#include <iostream> #include <string> #include <map> using namespace std; int main(){ multimap<string, int> m_map; string name="XiaoMing"; m_map.insert(make_pair(name, 50)); m_map.insert(make_pair(name, 55)); m_map.insert(make_pair(name, 60)); //方式1 cout<<"----------方法1-----------"<<endl; int k; multimap<string, int>::iterator m; m = m_map.find(name); for (k = 0; k != m_map.count(name); k++, m++) cout << m->first << "--" << m->second << endl; //方式2 cout<<"----------方法2-----------"<<endl; multimap<string, int>::iterator beg, end; beg = m_map.lower_bound(name); end = m_map.upper_bound(name); for (m = beg; m != end; m++) cout << m->first << "--" << m->second << endl; //方式3 cout<<"----------方法3-----------"<<endl; beg = m_map.equal_range(name).first; end = m_map.equal_range(name).second; for (m = beg; m != end; m++) cout << m->first << "--" << m->second << endl; return 0; }
方法一:標(biāo)準(zhǔn)的iterator的訪問方法,通過find函數(shù)找到所需要知道的關(guān)系”XiaoMing”的位置,再進(jìn)行”XiaoMing”的計(jì)數(shù),輸出共”XiaoMing”數(shù)量個(gè)數(shù)的元素內(nèi)容,以達(dá)到需求目的。
方法二:通過lower_bound和upper_bound找到”XiaoMing”的范圍進(jìn)行輸出。
方法三:通過equal_range獲取全部的”XiaoMing”內(nèi)容的元素,再通過迭代器進(jìn)行輸出。
這三種方法思想大同小異,請自主取舍進(jìn)行鞏固學(xué)習(xí)
C語言網(wǎng)提供由在職研發(fā)工程師或ACM藍(lán)橋杯競賽優(yōu)秀選手錄制的視頻教程,并配有習(xí)題和答疑,點(diǎn)擊了解:
一點(diǎn)編程也不會寫的:零基礎(chǔ)C語言學(xué)練課程
解決困擾你多年的C語言疑難雜癥特性的C語言進(jìn)階課程
從零到寫出一個(gè)爬蟲的Python編程課程
只會語法寫不出代碼?手把手帶你寫100個(gè)編程真題的編程百練課程
信息學(xué)奧賽或C++選手的 必學(xué)C++課程
藍(lán)橋杯ACM、信息學(xué)奧賽的必學(xué)課程:算法競賽課入門課程
手把手講解近五年真題的藍(lán)橋杯輔導(dǎo)課程