map
\(map\)是一棵紅黑樹,它作為一個容器儲存的是一個鍵值對另一個關鍵碼的映射。必須要定義鍵值類型的小於號。
聲明方法是:map<a,b> name;
其中\(a\)和\(b\)是數據類型,\(name\)是這棵紅黑樹的名字。
一般\(map\)都可以當做\(hash\)表來用,但是因為\(map\)內部是靠平衡樹維護的,所以復雜度是\(O(log)\)的,比一般的手寫\(hash\)要慢。但是\(map\)還支持中括號操作,所以一般情況下十分方便寫。
聲明方式
map<char,int> s;
map<char,int>::iterator it;
假設類型\(a\)是\(char\),類型\(b\)是\(int\),那么定義一個\(map\)和這個\(map\)的迭代器就是這樣寫。迭代器只支持訪問連續地址,所以就只能\(++it\)和\(--it\)。如果我用這個\(map\)來統計每個字符出現的次數,那么就可以直接寫s[ch]++;
name.size()
返回元素個數。
name.empty()
判斷\(map\)是否為空,為空則是邏輯真,否則就是邏輯假。
name.clear()
清空\(map\)。
name.begin()/name.end()
返回\(map\)的首迭代器和尾迭代器。左閉右開,所以尾迭代器為空。
對迭代器解除引用后會得到一個\(pair\)。
name.insert(pair<a,b>)/name.erase(pair<a,b>\(或迭代器\))
插入一個\(pair\)類型,刪除一個\(pair\)或者是迭代器。
name.find(x)
返回一個迭代器,存的是一個第一關鍵字為\(x\)的二元組。若不存在,則返回\(name.end()\)。
[]操作符
s[x]可以直接訪問第一關鍵字與x相等的二元組的第二關鍵字。但是如果不存在\(map\)就會先新建一個二元組,使得這個新建的二元組第一關鍵字為x,第二關鍵字為\(0\)。所以在使用[]操作符之前最好先\(find\)一下以x為第一關鍵字的二元組是否存在,不然用多了就會出現大量的無用二元組。