C++关联容器总结一
關聯容器
關聯容器: 通過鍵(key)儲存與讀取元素
順序容器: 通過元素在容器中的位置順序儲存,訪問
關聯容器類型
map 關聯數組:元素通過鍵來存儲和讀取
set 大小可變的集合,支持通過鍵實現的快速讀取, 具有集合的性質
multimap 支持同一個鍵多次出現的 map 類型
multiset 支持同一個鍵多次出現的 set 類型
與關聯容器相關的pair
pair:一種類模板, 定義在頭文件utility中
T1,T2為元素類型, 可以是容器或者類,pair類型
pair< T1,T2 >p , p對象當前具有兩個屬性T1,T2
訪問pair對象直接使用p.first , p.second 訪問其數據成員
關聯容器
關聯容器具有順序容器大部分操作 ,但沒有front, push_front, pop_front, back, push_back, pop_back,assign, resize操作
具有以下構造函數:
- C< T >c;
- C< T >c1(c2);
- C< T >c(b,e)
關聯容器不能通過容器大小來定義(即C< T >c(n) ), 當關聯容器通過大小來定義, 就無法確定初始化的那個對象需要采用哪個值或哪些值來初始化,若采用0來初始化這n個對象時將造成多個鍵重復,這樣就無法知道鍵所對應的值是哪個
map類型
map: 關聯數組(采用key獲取值與數組采用下標獲取值一致)
map構造函數
- map< k,v >m; 創建空的map對象, 其鍵與值為k, v
- map< k,v >m(m2); 創建m2的副本, m2與m必須具有相同的key,value
- map< k,v >m(b,e); m儲存迭代器b,e之間元素的副本, 元素必須能轉換為pair< const k, v >
map迭代器進行解引用的時候將產生pair對象
//m為存在鍵值的元素 map<string,int>::iterator iter=m.begin(); cout<<iter->first<<iter->second;鍵類型約束問題
map中key不但具有類型, 還具有一個相關的比較函數,比較函數必須在鍵類型上定義嚴格弱排序,因此在map元素插入的過程中元素會依據鍵的大小關系進行排序,鍵值類型必須定義”<”操作符
詳情觀看轉載
https://blog.csdn.net/qq_29344757/article/details/7869
例:
map對象可以使用vector< int >::iterator為key, iterator對象內置弱排序(iter可進行大小,加減比較操作)
map對象不可以使用list< int >::iterator為key, iterator對象內不能進行弱排序(iter只具有”==”與”!=”操作)
采用下標訪問map對象
int main(){map<string,int>m;m["hello"]=1;m["world"]=2;map<string,int>::iterator iter=m.begin();while(iter!=m.end()){cout<<iter->first;iter++;}cout<<m["!!!"];return 0; }針對m的過程
注:map采用下標的訪問過程與vector截然不同, map中如上第6步操作, 而vector將會拋出異常
map中insert的使用
map中的insert用法與順序容器一致, 不同在于插入的元素必須是pair類型的
map提供的insert
- m.insert(e): e是與m類型一致的pair類型, 如果e.first不存在m中, 那么將插入e.first作為鍵, 其值為e.second, 返回void; 若e存在m中則返回一個pair類型對象(假設對象名是p), p.first的值是map型迭代器(迭代器指向的位置是e.first), p.second的值是一個bool類型對象(值為false), 表示是否插入該元素
- m.insert(b,e): 插入迭代器b,e范圍之間的元素(元素類型必須為m.value_type類型的鍵值對), 不能指明總共插入多少個元素
- m.insert(iter,e): 以iter為起點位置,自動查找可適合的新元素儲存位置, 返回一個迭代器指向當前插入的元素的位置
注:插入的元素對象既可以是pair,也可以是map< T1,T2 >::value_type(key,value); 謹記value_type是pair< const key, value >的同義詞
例: 用于解釋m.inset(e)的返回值操作
p_sum的設計方式請參考m.insert(e)的返回值確定;
map中元素查找
- 直接類似數組的下標方式進行查找, 但是若元素未在容器中將出現插入操作,且關聯值為0, 給程序造成一定的負擔
- m.count(key): 返回m中key出現的次數
- m.find(key): key存在m中,返回指向key的迭代器, 不存在時返回超出末端的迭代器(所謂end())
map中元素的刪除
- m.erase(key): 在m中刪除鍵為key的元素,返回size_type類型的值(表示刪除的元素的個數)
- m.erase(iter): 刪除iter所指向的元素, iter!=end()且iter存在, 返回void
- m.erase(b,e): 刪除迭代器b,e范圍(b,e必須為有效范圍,指向m中的元素或最后一個元素的后一個位置)內的元素, 返回void
當進行map對象的遍歷的時候,采用const_iterator型迭代器
總結
以上是生活随笔為你收集整理的C++关联容器总结一的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Redis概述_使用命令对redis的数
- 下一篇: 学习Java中遇到的问题积累_1