天天看點

C++STL之關聯容器【map】【set】

map以鍵-值対的形式組織,鍵的作用在于索引,而值表示所存儲和讀取資料。

set僅包含一個鍵,并且有效的支援某個鍵是否存在的查詢。

他們都是基于标準型類庫pair實作,該類型在utility頭檔案中。

一:關于pair類型的操作

pair<T1,T2> p1; //建立一個空pair類型

pair<T1,T2> p1(v1,v2); //建立并初始化

make_pair(v1,v2) //生成pair對象

<,>,==,!=  //類型之間比較,遵循字典序,先比較first後second

p.first() //傳回first成員,

p.second() //傳回second成員

同時還支援一些容器的基本操作

#include <vector>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <stack>
#include <utility>
#include <string>
#include <map>
#include <iostream>
using namespace std;

int main()
{
    pair<int,int> p;
    p = make_pair(1,2) ;
    pair<int,string> p1(1,"sttttaa");
    string y;int x;
    pair<string,vector<int> > line;
    cout<<p1.first<<" "<<p1.second<<endl;
    while(cin>>x>>y)
    {
        p1=make_pair(x,y);
    }
    
    return 0;
}
           

二:map容器及set容器

1:構造函數及其定義的類型

map<k,v> m; 定義空的map

map<k,v> m(m2); 定義map初始化為m的副本

map<k,v> m(b,e); 定義map初始化為一個疊代器b到e的副本

傳回類型

map<k,v>::key_type; 鍵的類型

map<k,v>::mapped_type; 值的類型

map<k,v>::value_type; 一個pair類型

2:常用操作

支援insert的三種常用插入元素,先查找,不在的話插入

支援直接下标操作元素

m.count(v); 傳回鍵v在m中的值的個數

m.find(v); 傳回一個疊代器,如果存在傳回位置,否則指向尾

支援erase三種常用删除操作

支援容器常用周遊

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <map>
#include <cmath>
#include <map>
#include <utility>
#include <set>
using namespace std;
#define Del(a,b) memset(a,b,sizeof(a))

int main()
{
    map<string,int> m;  //建立
    m["yangdangl"]=5;//插入
    m.insert(map<string,int>::value_type("Ann",1));
    m["jame"]=6,m["wade"]=3;
    pair<string,int> p("james",6);
    string s="dasds";int t=200;
    p = make_pair(s,t);
    map<string,int>::iterator it;
    for(it=m.begin();it!=m.end();it++) //周遊
    {
        cout<<it->first<<" "<<it->second<<endl;
    }//查找
    cout<<m.count("jame")<<endl;
    it=m.find("yangdnagl");
    if(it!=m.end())
        cout<<it->second<<endl;
    m.erase("wade");m.erase(m.begin());
    for(it=m.begin();it!=m.end();it++) //周遊
    {
        cout<<it->first<<" "<<it->second<<endl;
    }
    m.erase(m.begin(),m.end());
    m.clear();
    return 0;
}
           

三:multimap和multiset

多重映射容器,即一個鍵可以對應多個值

其支援map和set的大多數操作,但是都不支援下标操作。

由于multimap中可能存在一個鍵對應多個值,而這多個值是相鄰存放的,那麼我們查找的時候可能需要查找到一個範圍,這裡介紹三個函數。

m.lower_bound(k); 傳回一個疊代器,指向不小于的第一個元素

m.upper_bound(k); 傳回一個疊代器,指向大于k的第一個元素

m.equal_range(); 傳回一個pair類型,第一個值為lower_bound()結果,第二個為upper_bound()結果。