亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

淺談C++ 容器查找效率

 更新時間:2025年06月27日 10:02:44   作者:pumpkin84514  
本文主要介紹了淺談C++ STL容器的查找效率差異,對比vector、list、set/map、unordered_set和deque等,幫助選擇合適容器以優(yōu)化性能,感興趣的可以了解一下

只要選對容器,多寫幾行代碼就能讓程序“飛”起來。下面用生活化的比喻 + 足夠多的帶注釋示例,幫你弄懂常用 STL 容器的查找特性。
讀完你應該能快速判斷:“我的場景該用哪一個?”

0. 先把“查找復雜度”聊明白

記號含義舉個??
O(1)常數(shù)時間像從冰箱門口拿飲料——一下就到手
O(log n)對數(shù)時間折半查電話簿——越找越快
O(n)線性時間排隊買奶茶——要挨個等

只要記?。簲?shù)字越小越快,O(1) 最爽,O(n) 最慢。

1. std::vector —— “排排坐”的長桌子

特點:元素一字排開,內(nèi)存連續(xù),跟操場跑道一樣直。

查找

  • 沒排序:只能一個個比——O(n)
  • 排好序:可折半查——O(log n)
#include <vector>
#include <algorithm>   // std::sort, std::binary_search
#include <iostream>

int main() {
    std::vector<int> nums{5, 1, 4, 3, 2};   // 連續(xù)擺放的「長桌子」
    
    std::sort(nums.begin(), nums.end());    // ① 排序一次,之后查找快
                                            //    nums 變成 {1,2,3,4,5}
    bool has3 = std::binary_search(         // ② 折半查找 3
        nums.begin(), nums.end(), 3);       //    O(log n)
    
    std::cout << (has3 ? "找到了" : "沒找到") << '\n';
}

什么時候用

  • 數(shù)據(jù)量可控、想要下標隨機訪問。
  • 插入刪除不多(尤其不是在中間插)。

2. std::list —— “珍珠項鏈”

  • 特點:每顆珠子(節(jié)點)用線(指針)串起來,插拔容易。
  • 查找:得一顆顆摸——O(n),而且分散指針不利于 CPU 緩存。
#include <list>
#include <algorithm>
#include <iostream>

int main() {
    std::list<int> lst{1, 2, 3, 4, 5};          // 一串節(jié)點
    
    auto it = std::find(lst.begin(), lst.end(), 3); // ① 線性查找
    std::cout << (it != lst.end() ? "找到了" : "沒找到") << '\n';
}

什么時候用插入 / 刪除動作特別頻繁、但不太在意查找速度,比如任務隊列需要隨時插入或移走元素。

3. std::set —— 自動排序的“有序字典”

  • 底層:紅黑樹,像一個能自動平衡的家譜圖。
  • 查找 / 增刪:都 O(log n)。
#include <set>
#include <iostream>

int main() {
    std::set<int> s{4, 1, 3, 2};      // 元素自動有序:{1,2,3,4}

    bool has2 = s.contains(2);        // C++20 起可直接 contains
    std::cout << (has2 ? "有 2" : "沒 2") << '\n';
}

什么時候用既想要“去重”又想要“元素排好序”,而且單個元素查找要快。

4. std::unordered_set —— “散列表”小黑屋

  • 底層:哈希表,把元素按哈希值分到不同“桶”里。
  • 平均查找:O(1),最壞沖突多時 O(n)。
  • 元素無序:放進去啥順序不管。
#include <unordered_set>
#include <iostream>

int main() {
    std::unordered_set<std::string> words; // 小黑屋摞桶
    words.insert("hello");
    words.insert("world");

    if (words.contains("hello")) {         // 平均 O(1)
        std::cout << "嘿~ 找到了 hello\n";
    }
}

什么時候用不需要順序,只想“秒查秒存”,典型如去重、統(tǒng)計次數(shù)。

5. std::map vs std::unordered_map —— 鍵值對“雙子星”

容器底層查找是否有序
map紅黑樹O(log n)?
unordered_map哈希表O(1) 平均?
#include <map>
#include <unordered_map>
#include <iostream>

int main() {
    std::map<int, std::string> ordered;          // 有序
    ordered[2] = "B"; ordered[1] = "A";

    std::unordered_map<int, std::string> hash;   // 無序
    hash[2] = "B"; hash[1] = "A";

    std::cout << ordered[1] << ' ' << hash[1] << '\n';
}

什么時候用

  • 需要按鍵遍歷且保持有序:map。
  • 只關心查、增、刪速度:unordered_map。

6. std::deque —— 可以從兩頭裝菜的“長盤子”

  • 特點:首尾插入 / 刪除都是 O(1);中間操作比 vector 慢點。
  • 查找:線性 O(n);隨機訪問語法與 vector 一樣。
#include <deque>
#include <algorithm>
#include <iostream>

int main() {
    std::deque<int> q{1, 2, 3};
    q.push_front(0);        // 頭部 O(1)
    q.push_back(4);         // 尾部 O(1)

    bool has3 = std::find(q.begin(), q.end(), 3) != q.end();
    std::cout << (has3 ? "有 3" : "沒 3") << '\n';
}

什么時候用既想要隨機訪問,又要在首尾頻繁加減元素,比如滑動窗口算法。

7. “多索引”技巧 —— 一份數(shù)據(jù),多把鑰匙

如果你既想按 ID 查,又想按 名字 查,可以:

#include <vector>
#include <unordered_map>

struct User { int id; std::string name; };

std::vector<User> users;                      // 主數(shù)組
std::unordered_map<int, User*> id_index;      // id → 指針
std::unordered_map<std::string, User*> name_index; // name → 指針
  • 插入一個用戶時,三處都要更新
  • 查找時,從對應索引直接拿到指針,速度飛快。

8. 記憶卡片(純中文朗朗上口)

小而隨機選 vector
插刪中間選 list
要有序就 set/map
求極致快 unordered_*
兩頭忙活用 deque
多條件查 自建索引

最后一句話

先寫代碼,測一次性能——復雜度只給方向,真快還是得跑數(shù)據(jù)。祝你寫得順、跑得飛!

到此這篇關于淺談C++ 容器查找效率的文章就介紹到這了,更多相關C++ 容器查找效率內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家! 

相關文章

  • C++中的for-each循環(huán)使用

    C++中的for-each循環(huán)使用

    范圍循環(huán)是C++11引入的特性,用于簡化數(shù)組和容器的遍歷過程,它通過直接操作元素而不是使用索引或迭代器,范圍循環(huán)可以使用引用或const修飾符來控制元素的修改權限,適用于所有支持begin()和end()方法的容器,該循環(huán)方式不適用于未提供這些方法的C++98/03容器
    2024-09-09
  • 最大對稱字符串的算法

    最大對稱字符串的算法

    題目:輸入一個字符串,輸出該字符串中對稱的子字符串的最大長度。比如輸入字符串“google”,由于該字符串里最長的對稱子字符串是“goog”,因此輸出4。
    2013-03-03
  • C語言實現(xiàn)掃雷游戲源代碼

    C語言實現(xiàn)掃雷游戲源代碼

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)掃雷游戲源代碼,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-03-03
  • C語言多媒體框架GStreamer使用教程深講

    C語言多媒體框架GStreamer使用教程深講

    GStreamer 是用來構建流媒體應用的開源多媒體框架(framework),其目標是要簡化音/視頻應用程序的開發(fā),已經(jīng)能夠被用來處理像 MP3、Ogg、MPEG1、MPEG2、AVI、Quicktime 等多種格式的多媒體數(shù)據(jù)
    2022-07-07
  • 探討++i與i++哪個效率更高

    探討++i與i++哪個效率更高

    i++總是要創(chuàng)建一個臨時對象,在退出函數(shù)時還要銷毀它,而且返回臨時對象的值時還會調用其拷貝構造函數(shù)
    2013-10-10
  • C++聚合關系類的構造函數(shù)的調用順序詳解

    C++聚合關系類的構造函數(shù)的調用順序詳解

    下面小編就為大家?guī)硪黄狢++聚合關系類的構造函數(shù)的調用順序詳解。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考,一起跟隨小編過來看看吧
    2016-05-05
  • C++大數(shù)模板(推薦)

    C++大數(shù)模板(推薦)

    本篇文章是對C++大數(shù)模板的程序代碼進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • C語言數(shù)據(jù)結構之圖書借閱系統(tǒng)

    C語言數(shù)據(jù)結構之圖書借閱系統(tǒng)

    這篇文章主要為大家詳細介紹了C語言數(shù)據(jù)結構之圖書借閱系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • C++實現(xiàn)截圖截屏的示例代碼

    C++實現(xiàn)截圖截屏的示例代碼

    本文主要介紹了C++實現(xiàn)截圖截屏的示例代碼,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • C++中實現(xiàn)線程安全和延遲執(zhí)行詳解

    C++中實現(xiàn)線程安全和延遲執(zhí)行詳解

    這篇文章主要為大家詳細介紹了C++中實現(xiàn)線程安全和延遲執(zhí)行的相關知識,文中的示例代碼講解詳細,具有一定的借鑒價值,需要的小伙伴可以了解下
    2024-01-01

最新評論