日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

C++?容器中map和unordered?map區別詳解_C 語言

作者:極智視界 ? 更新時間: 2022-12-14 編程語言

C++ 中 map 和 unordered_map區別

map 和 unordered_map 都可以看做是一種 key-value 的映射關系,unordered_map 可以理解為 無序版的map。unordered_map 是在 C++11 標準才出現的,所以你在代碼中如果使用了 unordered_map,則在編譯的時候要使用 c++11及以后的標準 進行編譯。

這里直擊要點:

  • map 底層是 紅黑樹,(1) 增、刪、改、查都是十分平穩的 log(n) 的復雜度,(2) 基于二叉查找樹,數據是有序排列的 (按 key 排序)。在存儲上 map 比較占用空間,因為在紅黑樹中,每一個節點都要額外保存父節點和子節點的連接,因此使得每一個節點都占用較大空間來維護紅黑樹的性質。
  • unordered_map 底層是 hash表, 其查找的復雜度是常數級別的 O(1),構造的時候如果有沖突時間成本會增加,并且做不到數據有序排列。沖突的解決:當沖突數小于8的時候用鏈式地址法解決沖突,當沖突大于8的時候使用紅黑樹解決沖突。

? ?來把區別用表格展示:

?? map 和 unordered_map 在代碼使用上十分類似,來看看兩者的用法:

int main(){
  //// map 用法
  map<int, string> _ismap;
  // 增的三種方法
  _ismap.insert(make_pair(0, "kobe"));
  _ismap[1] = "james";
  _ismap.insert(map<int, string>::value_type(2, "curry"));
  // 遍歷
  for (auto &iter : _ismap){
    cout << iter.first << " : " << iter.second << endl;
    /*
    * 輸出如下 按key遞增排序
    * 0 : kobe
    * 1 : james
    * 2 : curry
    */
  }
  // 刪除
  map<int, string> ::iterator _mapIter = _ismap.find(0);
  _ismap.erase(_mapIter);    // 刪除指定的key
  // _ismap.erase(0);  // 刪除key=0的鍵值對
  // _ismap.erase(std::begin(_ismap));   // 刪除第一個鍵值對
  //// unordered_map 用法
  unordered_map<int, string> _isunorderedMap;
  // 增的三種方法
  _isunorderedMap.insert(make_pair(0, "yaoming"));
  _isunorderedMap[1] = "yi";
  _isunorderedMap.insert(unordered_map<int, string>::value_type(2, "zhouqi"));
  // 遍歷
  for (auto iter = unorderedMap.begin(); iter != unorderedMap.end(); iter++){
    cout << iter->first << " : " << iter->second << endl;
    /*
    * 輸出如下 亂序
    * 2 : zhouqi
    * 0 : yaoming
    * 1 : yi
    */
    // 刪除
    auto _unorderedIter = _isunorderedMap.find(0);
    _isunorderedMap.erase(_unorderedIter);     // 刪除指定的key
    // _unorderedIter.erase(0);    // 刪除key=0的鍵值對
    // _unorderedIter(_unorderedIter.begin());    // 刪除第一個鍵值對
  }
}

原文鏈接:https://juejin.cn/post/7166520682384195614

欄目分類
最近更新