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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

关联容器

發布時間:2025/4/16 编程问答 11 豆豆
生活随笔 收集整理的這篇文章主要介紹了 关联容器 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

關聯容器的類型:?

map:關聯數組;元素通過鍵來從存儲讀取

set:大小可變的集合,至此后通過建實現快速讀取

multimap:支持同一個鍵多次出現的map類型

multiset:支持同一個鍵多次出現的set類型

一般來說,如果希望有效地存儲不同值的集合,那么使用set比較合適,而map容器則更適用于需要存儲乃至修改每個鍵所干練的值的情況。在做某種文本處理時,可使用set保存要忽略的單詞。而字典是map的一種很好的應用,單詞本身是鍵而他的解釋說明則是值,

在開始介紹關聯容器之前必須先了解一種魚值相關的簡單的標準庫類型--pair類型;該類型在utility中定義。

pair的基本操作;

pair<string , string >anon;//

pair<string ,int >word_count;//包含一個空的string和一個空的int

pair<string,vector<int> >line;//包含一個空的string,和一個空vector;

當然也可以,在定義是為每個成員提供初始值;

pair<string,string> author("jame","joyce");

此時author的倆個公有成員first,second,就有了值,author.first="jame",,,,author.second=joce;

還可以這樣:

typedef pair<string ,string > author;

author pro("sfg","sfge");簡化其聲明;

make_pair(v1,v2);//以v1和v2的值創建一個新的pair對象,其元素分別是v1和v2的類型。

[cpp]?view plaincopy
  • #include?<utility>??
  • #include?<iostream>??
  • #include?<vector>??
  • #include?<string>??
  • using?namespace?std;??
  • int?main()??
  • {??
  • ????pair<string,int>pr;??
  • ????string?str;??
  • ????int?a;??
  • ????vector<?pair<string,int>?>vec;??
  • ????while?(cin>>str>>a)??
  • ????{??
  • ????????pr=make_pair(str,a);??
  • ????????vec.push_back(pr);??
  • ????}??
  • ??
  • ????return?0;??
  • }??

  • map類型可理解為關聯數組。使用鍵做為下表來獲取一個值。

    map的構造函數:

    map<k,v>m;//創建一個名為m的空map對象,其鍵和值的類型分別為k和v
    map<k,v>m(m2);//創建m2的副本m,m和m2必須有相同的鍵類型和值類型

    map<k,v>m(b,e);//創建map類型的對象m,存儲迭代器b和e標記的范圍內所有元素的副本,元素的類型必須能轉換為pair<const k,v>

    對于鍵的類型唯一的約束就是必須支持<操作符,至于是否支持其他的關系或想等運算則不作要求。

    map類定義的類型:

    map<k,v>::key_type;//map容器中,用作索引的鍵的類型

    map<k,v>::mapped_type;//map容器中。鍵所關聯的值的類型

    map<k,v>::value_type;//一個pair類型,它的first元素具有const map<>::key_type類型,而second元素則為map<>::mapped_type類型;

    在學習map接口時,需謹記value_type是pair類型,它的值成員可以修改,而建成員不能修改。

    1,map迭代器進行解引用將產生map的對象。

    [cpp]?view plaincopy
  • map<string,int?>mp??
  • map<string,int?>::iterator?mit=mp.begin();??
  • cout<<mit->first??
  • 對迭代器進行解引用將獲得一個pair對象, 它的first成員存放鍵,為const, 而second則存放值。

    2,給map添加元素

    定義了map容器后,下一步工作就是在容器中添加鍵值,該項工作可使用insert成員實現,map不支持front,push_front,push_back等操作。

    1)使用下標訪問map對象:

    map<string,int>word;

    word["anna"]=1;

    此段程序將發生以下事情:

    1.在word中查找鍵位anna的元素,沒有找到

    2.講一個姓的鍵值對插入到word中,它的鍵是const string類型的對象,保存anna,而他的值則是采用直初始化,就意味著本例中的值為0

    3.將這個新的鍵值對插入到word中

    4.讀取新插入的元素并將它的值賦為1;

    使用下標訪問不存在的元素將導致在map容器中添加一個新的元素,它的鍵即為下標值。

    [cpp]?view plaincopy
  • cout<<word["anna"];//通過anan訪問該元素;并輸出1;??
  • ++word["anna"];//訪問該元素并加1;??
  • cout<<word["anna"];//輸出值為2;??
  • 顯然,map下標操作符返回的類型與map迭代器進行解引用獲得的類型不相同;map迭代器返回value_type類型的值,包括const key_type和mapped_type類型成員的pair對象;而下標操作則返回一個mapped_type類型的值。

    2)下標行為的編程意義

    對于map容器如果下標所表示的鍵在容器中不存在則添加新元素,這一特征可使程序驚人的簡練;

    [cpp]?view plaincopy
  • map<string,int?>?word;??
  • string?str;??
  • while(cin>>str)??
  • ??++word[str];??
  • 這段程序創建了一個map對象,用來記錄單詞出現的次數,while循環每次從標準輸入讀取一個單詞,如果這是一個新單詞,則在word中添加該單詞為索引的新元素,如果讀入的單詞已經在map中則它所對應的值加1;

    ? ?其中最有趣的是,在單詞第一次出現時,會在word中創建并插入一個以該單詞為索引的新單詞,同時將它的值初始化為0;然后立即加1;所以每次在map中添加新元素時,搜統計的出現次數正好為1;

    map::insert的使用:

    word.insert(map<string,int>::value_type("Anna",1));

    可用兩種方法簡化:

    word.insert(make_pair("anna",1));

    或:typedef map<string,int>::value_tye valType;

    word.insert(valType("anna",1));

    map對象中一個給定鍵值對應一個元素,如果試圖插入的元素對應的鍵已經在容器中,則insert將不做任何操作。

    insert返回值為包含一個迭代器和一個bool值的pair對象。

    map<string,int >mp;

    pair<map<string,int>::iterator,bool>ret=mp.insert(word,1);

    使用下標存在一個很危險的副作用:如果該鍵不在map容器中那么下標操作會插入一個具有該鍵的新元素。有時著東西很有用但有時卻帶來危險

    例如若是我們只想知道某元素是否存在。。。。

    map容器提供倆個操作,count和find,用于檢查某個鍵是否存在而不會插入該鍵;

    m.count(k);//返回m中k出現的次數。

    m.find(k);//如果m容器中存在k索引的元素,則返回只想該元素的迭代器,如果不存在,則返回超出末端迭代器。


    從map中刪除元素

    map.erase(k);//刪除m中鍵為k的元素,返回size_type類型的值。表示刪除的元素個數

    map.erase(p);//從m中刪除迭代器p所指向的元素,p必須指向m中確實存在的元素,而且不能等于m.end;返回void

    map.erase(b,e);//從m中刪除一段范圍內的元素該范圍有迭代器對b和e標記,返回void

    map同樣提供begin和end運算。


    總結

    以上是生活随笔為你收集整理的关联容器的全部內容,希望文章能夠幫你解決所遇到的問題。

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