【C++】undered_map的用法總結(1)


1.介紹

unordered_map是一個關聯容器,內部采用的是hash表結構,擁有快速檢索的功能。

1.1 特性

關聯性:通過key去檢索value,而不是通過絕對地址(和順序容器不同)
無序性:使用hash表存儲,內部無序
Map : 每個值對應一個鍵值
鍵唯一性:不存在兩個元素的鍵一樣
動態內存管理:使用內存管理模型來動態管理所需要的內存空間

 

1.2 Hashtable和bucket


由於unordered_map內部采用的hashtable的數據結構存儲,所以每個特定的key會通過一些特定的哈希運算映射到一個特定的位置,我們知道,hashtable是可能存在沖突的(多個key通過計算映射到同一個位置),在同一個位置的元素會按順序鏈在后面。所以把這個位置稱為一個bucket是十分形象的(像桶子一樣,可以裝多個元素)。

所以unordered_map內部其實是由很多哈希桶組成的,每個哈希桶中可能沒有元素,也可能有多個元素。

 

2. 模版

1 template < class Key,                                 //unordered_map::key_type
2            class T,                                   //unordered_map::mapped_type
3            class Hash = hash<Key>,                //unordered_map::hasher 
4            class Pred = equal_to<Key>,             //unordered_map::key_equal
5            class Alloc = allocator< pair<const Key,T> >  // unordered_map::allocator_type
6            > class unordered_map;

主要使用的也是模板的前2個參數<鍵,值>

1 unordered_map<const Key, T> map;

 

2.1 迭代器

unordered_map的迭代器是一個指針,指向這個元素,通過迭代器來取得它的值。

1 unordered_map<Key,T>::iterator it;
2 (*it).first;             // the key value (of type Key)
3 (*it).second;            // the mapped value (of type T)
4 (*it);                   // the "element value" (of type pair<const Key,T>) 

它的鍵值分別是迭代器的first和second屬性。

1 it->first;               // same as (*it).first   (the key value)
2 it->second;              // same as (*it).second  (the mapped value) 

 

3. 函數

3.1 構造函數

unordered_map的構造方式有幾種: 

  • 構造空的容器 
  • 復制構造  
  • 范圍構造 
  • 用數組構造

運行結果:

 

3.2 容量操作

3.2.1 size

1 size_type size() const noexcept;

返回unordered_map的大小。

3.2.2 empty

1 bool empty() const noexcept;
  • 為空返回true 
  • 不為空返回false,和用size() == 0判斷一樣。

 

3.3 元素操作

3.3.1 find

1 iterator find ( const key_type& k );          // 根據key獲取value

查找key所在的元素。

  • 找到:返回元素的迭代器。通過迭代器的second屬性獲取值
  • 沒找到:返回unordered_map::end。

3.3.2 insert

插入有幾種方式:

  • 復制插入(復制一個已有的pair的內容)
  • 數組插入(直接插入一個二維數組)
  • 范圍插入(復制一個起始迭代器和終止迭代器中間的內容)
  • 數組訪問模式插入(和數組的[]操作很相似)

具體的例子可以看后面示例代碼。

 

3.3.3 at

1 mapped_type& at ( const key_type& k );       //根據key獲得value


查找key所對應的值

  • 如果存在:返回key對應的值,可以直接修改,和[]操作一樣。
  • 如果不存在:拋出 out_of_range 異常.

mymap.at(“Mars”) = 3396; //mymap[“Mars”] = 3396

 

3.3.4 erase

擦除元素也有幾種方式:

  • 通過位置(迭代器)
1 iterator erase ( const_iterator position );
  • 通過key
1 size_type erase ( const key_type& k );
  • 通過范圍(兩個迭代器)
1 iterator erase ( const_iterator first, const_iterator last );

3.3.5 clear

1 void clear() noexcept

清空unordered_map

3.3.6 swap

1 void swap ( unordered_map& ump );

交換兩個unordered_map(注意,不是交換特定元素,是整個交換兩個map中的所有元素)

3.3.7 示例代碼

運行結果:

 

3.4 迭代器和bucket操作

3.4.1 begin

1 iterator begin() noexcept;
2   local_iterator begin ( size_type n );
  • begin() : 返回開始的迭代器(和你的輸入順序沒關系,因為它的無序的)
  • begin(int n) : 返回n號bucket的第一個迭代器

3.4.2 end

1  iterator end() noexcept;
2   local_iterator end( size_type n );
  • end(): 返回結束位置的迭代器
  • end(int n) : 返回n號bucket的最后一個迭代器

3.4.3 bucket

1 size_type bucket ( const key_type& k ) const;

返回通過哈希計算key所在的bucket(注意:這里僅僅做哈希計算確定bucket,並不保證key一定存在bucket中!)

3.4.4 bucket_count

1 size_type bucket_count() const noexcept;

返回bucket的總數

3.4.5 bucket_size

1 size_type bucket_size ( size_type n ) const;

返回第i個bucket的大小(這個位置的桶子里有幾個元素,注意:函數不會判斷n是否在count范圍內)

3.4.6 示例代碼

 

運行結果:

 轉自:https://blog.csdn.net/hk2291976/article/details/51037095


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM