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操作低的效能,所以在此不做細說