最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

淺談C++ 容器查找效率

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

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

0. 先把“查找復(fù)雜度”聊明白

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

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

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

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

查找

  • 沒排序:只能一個(gè)個(gè)比——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í)候用

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

2. std::list —— “珍珠項(xiàng)鏈”

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

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

什么時(shí)候用插入 / 刪除動(dòng)作特別頻繁、但不太在意查找速度,比如任務(wù)隊(duì)列需要隨時(shí)插入或移走元素。

3. std::set —— 自動(dòng)排序的“有序字典”

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

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

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

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

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

  • 底層:哈希表,把元素按哈希值分到不同“桶”里。
  • 平均查找:O(1),最壞沖突多時(shí) O(n)。
  • 元素?zé)o序:放進(jì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";
    }
}

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

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

容器底層查找是否有序
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';
}

什么時(shí)候用

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

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

  • 特點(diǎn):首尾插入 / 刪除都是 O(1);中間操作比 vector 慢點(diǎn)。
  • 查找:線性 O(n);隨機(jī)訪問語法與 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';
}

什么時(shí)候用既想要隨機(jī)訪問,又要在首尾頻繁加減元素,比如滑動(dòng)窗口算法。

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 → 指針
  • 插入一個(gè)用戶時(shí),三處都要更新
  • 查找時(shí),從對(duì)應(yīng)索引直接拿到指針,速度飛快。

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

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

最后一句話

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

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

相關(guān)文章

  • C語言深入探究水仙花數(shù)與變種水仙花數(shù)代碼

    C語言深入探究水仙花數(shù)與變種水仙花數(shù)代碼

    求水仙花數(shù)和變種水仙花數(shù)是非常適合初學(xué)者學(xué)習(xí)的代碼,其中包含的循環(huán)和邏輯方式等知識(shí)點(diǎn)。這既能起到對(duì)以往知識(shí)的復(fù)習(xí),也可以學(xué)習(xí)到一種不同的邏輯思考方式
    2022-05-05
  • 詳解C++編程中運(yùn)算符的使用

    詳解C++編程中運(yùn)算符的使用

    這篇文章主要介紹了詳解C++編程中運(yùn)算符的使用,是C++入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-09-09
  • linux C 打印錯(cuò)誤信息和標(biāo)準(zhǔn)輸入輸出詳細(xì)介紹

    linux C 打印錯(cuò)誤信息和標(biāo)準(zhǔn)輸入輸出詳細(xì)介紹

    這篇文章主要介紹了linux C 打印錯(cuò)誤信息和標(biāo)準(zhǔn)輸入輸出詳細(xì)介紹的相關(guān)資料,需要的朋友可以參考下
    2016-12-12
  • C++begin和end運(yùn)算符的返回迭代器的類型如何判斷?

    C++begin和end運(yùn)算符的返回迭代器的類型如何判斷?

    今天小編就為大家分享一篇關(guān)于C++begin和end運(yùn)算符的返回迭代器的類型如何判斷?,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-04-04
  • C語言字符串函數(shù)入門

    C語言字符串函數(shù)入門

    這篇文章主要為大家介紹了C語言字符串函數(shù),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-01-01
  • C++中動(dòng)態(tài)內(nèi)存管理的實(shí)現(xiàn)

    C++中動(dòng)態(tài)內(nèi)存管理的實(shí)現(xiàn)

    本文主要介紹了C++中動(dòng)態(tài)內(nèi)存管理的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-09-09
  • C語言中定義與聲明有哪些區(qū)別

    C語言中定義與聲明有哪些區(qū)別

    在C/C++中有一個(gè)基礎(chǔ)且重要的知識(shí),什么是聲明?什么是定義?他們的區(qū)別是什么?本文將帶你理清其中的區(qū)別
    2022-07-07
  • C++調(diào)用C函數(shù)實(shí)例詳解

    C++調(diào)用C函數(shù)實(shí)例詳解

    這篇文章主要介紹了C++調(diào)用C函數(shù)實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-07-07
  • C++中的常用庫

    C++中的常用庫

    這篇文章主要介紹了C++中的常用庫,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-05-05
  • 深入解析C++中類的多重繼承

    深入解析C++中類的多重繼承

    這篇文章主要介紹了深入解析C++中類的多重繼承,包括多重繼承相關(guān)的二義性問題,需要的朋友可以參考下
    2015-09-09

最新評(píng)論

屯昌县| 阳高县| 通许县| 浙江省| 宣化县| 北辰区| 隆德县| 麻阳| 五原县| 辉南县| 阿克陶县| 柳林县| 富民县| 明水县| 韩城市| 晋州市| 无棣县| 枞阳县| 永胜县| 阳春市| 尼勒克县| 通榆县| 金溪县| 普兰县| 平湖市| 莎车县| 开原市| 泉州市| 汉源县| 眉山市| 巴楚县| 惠州市| 昭通市| 铜山县| 甘德县| 孙吴县| 昌宁县| 万全县| 江北区| 仁布县| 启东市|