c++map 查詢元素和list查詢元素速度對比

一点灯發表於2024-10-11

在C++中,std::map和std::list是兩種不同的容器型別,前者是基於紅黑樹實現的關聯容器,後者是雙向連結串列。

如果你想比較這兩種容器在查詢元素上的速度,通常std::map會比std::list快得多。因為std::map的查詢操作是平均常數時間複雜度,即O(log n),而std::list的查詢操作是線性時間複雜度,即O(n)。

以下是使用std::map和std::list查詢元素的簡單示例:

#include <iostream>
#include <map>
#include <list>
#include <string>
#include <chrono>
 
int main() {
    std::map<int, std::string> myMap;
    std::list<std::pair<int, std::string>> myList;
 
    // 填充資料
    for (int i = 0; i < 10000; ++i) {
        myMap[i] = "value" + std::to_string(i);
        myList.push_back(std::make_pair(i, "value" + std::to_string(i)));
    }
 
    // 使用map查詢元素
    int keyToFind = 5000;
    auto start = std::chrono::high_resolution_clock::now();
    auto itMap = myMap.find(keyToFind);
    auto end = std::chrono::high_resolution_clock::now();
    std::chrono::duration<double> diff = end - start;
    std::cout << "Find in map: " << diff.count() << " seconds\n";
 
    // 使用list查詢元素
    start = std::chrono::high_resolution_clock::now();
    auto itList = std::find_if(myList.begin(), myList.end(), [&](const std::pair<int, std::string>& p) {
        return p.first == keyToFind;
    });
    end = std::chrono::high_resolution_clock::now();
    diff = end - start;
    std::cout << "Find in list: " << diff.count() << " seconds\n";
 
    return 0;
}

在上面的程式碼中,我們分別在std::map和std::list中查詢了一個元素,並記錄了查詢所需的時間。你可以執行這個程式,並比較兩種情況下所需的時間來看出效能上的差異。

請注意,實際情況中,std::list的查詢可能會稍慢一些,因為它還需要處理指標操作。而std::map的查詢速度快的原因是紅黑樹的特性,它能保持資料的有序性,並且能進行高效的二分查詢。

相關文章