日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++关联容器总结一

發布時間:2024/7/5 c/c++ 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 訪問其數據成員

pair<int, pair<string,int> >p1(1,"hello",1); //注意p1前面兩個大于號之間要留有空格,防止編譯時看成位運算 //p1具有三個屬性(int string int) cout<<p1.first<<p1.second.first<<p1.second.second; //first,second分別對應著p1對象的兩個數據成員

關聯容器
關聯容器具有順序容器大部分操作 ,但沒有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的過程

  • 在m中查找hello的元素,但未找到
  • 將hello作為key插入m中,類型為const string, 在例子中初始值為0
  • 將鍵值對插入到m中
  • 讀取插入的元素, 對其賦值為1
  • 同理,m[“world”]與m[“hello”]的過程類似
  • 最后的m[“!!!”]表示: 訪問下標(key)未在m中的鍵值對,那么將會在m中添加當前鍵, 其值初始化為0(使用默認的構造函數進行初始化)
  • 注: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)的返回值操作

    //統計文章中單詞出現的個數 map<string,int>m; pair<string,int>p_tran//將每次輸入的world轉化為pair類型 string world while(cin>>world){pair<map<string,int>::iterator,bool>p_sum=m.insert( p_tran(world,1) );if(!p_sum->second)++(p_sum->first->second); //表示對m中元素的值進行自增,不加括號時,注意符號優先級 } map<string,int>::iterator iter=m.bengin(); while(iter!=m.end()){cout<<iter->first<<" 單詞數目: "<<iter->second;++iter; }

    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++关联容器总结一的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。