C++STL容器map與multimap

map與multimap基本性能

map和multimap屬於關聯式容器,它們將key/value pair當作元素進行管理,會根據key的排序準則自哦對那個爲元素排序。和其他所有關聯式容器一樣,map/multimap通常以平衡二叉樹完成。map/multimap的特點在於其元素是key/value pair類型,其次,map可作爲關聯式數組來運用。

受自動排序的影響,通過key值來查找元素會有很好的效率,但你不能直接改變元素的key,這會破壞正確次序。要想修改元素的key,你必須先移除擁有該key的元素,然後插入新的key/value的元素。

map與multimap使用須知

1.頭文件

#include<map>

2.class template

namespace std
{
    template <typename Key, typename T,
              typename Compare = less<key>,
              typename Allocator = allocator<pair<const key, T>>>
            class map;
    template <typename Key, typename T,
              typename Compare = less<key>,
              typename Allocator = allocator<pair<const key, T>>>
            class multimap;
}

第一個template實參將成爲元素的key類型,第二個template實參將成爲元素的value類型。

值得注意的是,map和multimap的元素類型key和T必須滿足一下條件:

1.key和T都必須是copyable或movable(可複製和搬移的)。

2.對指定的排序準則而言,key必須是comparable(可比較的)。

3.元素類型是一個pair<const key,T>。

4.第三個實參template可有可無,用來定義排序準則。排序準則必須定義爲strict weak ordering。不傳入排序準則的情況下,默認使用less<>準則。

默認情況下,multimap對於等價key的元素的排序保持其相對次序不變。

map與multimap操作函數

1.創建、複製和銷燬

map c                 //default構造函數,建立一個空的map/multimap,不含任何元素
map c(op)             //建立一個空的map/multimap,以op爲排序準則
map c(c2)             //copy構造函數,建立一份相同類型的map/multimap的拷貝
map c=c2              //copy構造函數,建立一份相同類型的map/multimap的拷貝
map c(beg,end)        //以區間[beg,end)元素爲初值,建立一個map/multimap
map c(beg,end,op)     //以區間[beg,end)元素爲初值,並以op爲排序準則,建立一個map/multimap
c.~map()              //銷燬所有元素,釋放內存
map<key,val>          //一個map,以less<>爲排序準則
map<key,val,op>       //一個map,以op爲排序準則
multimap<key,val>     //一個multimap,以less<>爲排序準則
multimap<key,val,op>  //一個multimap,以op爲排序準則

2.非更易型操作

c.key_comp()   //返回key的比較準則
c.value_comp() //返回value的比較準則
c.empty()      //返回是否容器爲空
c.size()       //返回目前元素個數
c.max_size()   //返回元素個數之最大可能

3.特殊查找動作

c.count(val)       //返回“key爲val”的元素個數
c.find(val)        //返回”key爲val”的第一個元素,找不到就返回end()
c.lower_bound(val) //返回“key爲val”之元素的第一個可安插位置,也就是“key>=val”的第一個元素位置
c.upper_bound(val) //返回“key爲val”之元素的最後一個可安插位置,也就是“key>val”的第一個元素位置
c.equal_range(val) //返回“key爲val”之元素的第一個可安插位置和最後一個可安插位置,也就是“key==val”的元素區間,返回值爲pair型

4.迭代器函數和元素訪問

map/multimap不支持元素直接訪問,唯一的例外map提供at()以及subscrip(下標)操作符來直接訪問元素。通常情況下,元素的訪問時經由range-based-for循環或迭代器進行

c.begin();  //返回一個bidirectional iterator指向第一元素
c.end();    //返回一個bidirectional iterator指向最末元素的下一位置
c.rbegin(); //返回一個reverse iterator指向反向迭代的第一元素
c.rend();   //返回一個reverse iterator指向反向迭代的最末元素的下一位置

5.元素的安插和移除

c.insert(val)      //安插一個val拷貝,返回新元素位置,無論是否成功
c.insert(pos,val)  //安插一個val拷貝,返回新元素位置,pos是一個查找起點提示
c.insert(beg,end)  //將區間[beg,end)內所有元素拷貝安插
c.emplace(val)     //安插一個初值爲val的元素,返回新元素的位置,無論是否成功
c.erase(val)       //移除與“val”相等的所有元素,返回被移除的元素個數
c.erase(pos)       //移除iterator位置pos上的元素,無返回值
c.erase(beg,end)   //移除區間[beg,end)內的所有元素,無返回值
c.clear()          //移除所有元素,將容器清空

因爲將map視爲關聯數組的操作雖然在代碼上顯得方便簡介,但因其需要先default構造函數將value初始化,會獲得比常規map操作低的效能,所以在此不做細說

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章