C++常見數據結構圖文詳解

聲明

本文轉自https://www.cnblogs.com/woxinfeixiang2015/p/10373674.html


程序 = 數據結構 + 算法

數組

在這裏插入圖片描述

靜態數組

運行期間無法改變數組大小,由編譯期間確定,C++中array即此類

int main ()
{
    array<int, 10> a = {0,1,2,3,4,5,6,7,8,9};
    a[0] = 22;
    cout<<a.at(0)<<endl;
    cout<<a.back()<<endl;

    return 0;
}

動態數組:C++中有兩個,分別是vector和deque

vector

矢量,只能在末尾增刪元素

數組大小增長策略:每次增加長度爲原來1倍(有些編譯器增加0.5倍)

這樣可保證追加元素的平均時間複雜度爲O(1)

int main ()
{
    vector<int> vv = {1,2,3,4};
    vv.push_back(12);// 在末尾添加元素
    vv.pop_back();// 在末尾刪除元素
    vv.at(3);// 讀取第三個元素
    vv[3];// 讀寫第三個元素
    vv.insert(vv.begin()+3, 12);// 將元素插到第三個位置上
    
    return 0;
}
priority_queue

優先隊列,默認由 vector 實現,也可由 deque 實現。它保證頂部元素始終是最大值,可用於實現堆排序。

int main ()
{
    priority_queue<int> pp;
    pp.push(12);
    pp.push(10);
    pp.push(11);
    pp.top();// 讀取頂部元素
    pp.pop();// 彈出頂部元素
    
    return 0;
}
deque

雙端隊列,可在開頭或末尾增刪元素

int main ()
{
    deque<int> dd;
    dd.push_front(12);// 在開頭添加元素
    dd.push_back(10);// 在結尾添加元素
    dd.insert(dd.begin()+1, 3);// 在位置1插入元素
    dd.front();// 讀取開頭元素
    dd.back();// 讀取結尾元素
    dd[1]; // 讀取第一個元素
    dd.pop_front();// 彈出開頭元素
    dd.pop_back();// 彈出末尾元素

    return 0;
}
stack

棧,默認由 deque 實現,也可由 list 或 vector 實現。是一種先進後出的數據結構

int main ()
{
    stack<int> ss;
    ss.push(12);// 添加元素
    ss.top();// 讀取棧頂元素
    ss.pop();// 彈出棧頂元素

    return 0;
}
queue

隊列,默認由 deque實現,也可由 list 實現。是一種先進先出的數據結構

int main ()
{
    queue<int> qq;
    qq.push(12);// 添加元素
    qq.front();// 讀取隊首元素
    qq.pop();// 彈出隊首元素

    return 0;
}

單向鏈表

在這裏插入圖片描述

forward_list

只能從頭到尾順序遍歷,不能逆序遍歷,即沒有 rbegin() 接口

int main ()
{
    forward_list<int> fl;
    fl.push_front(12);// 在開頭添加元素
    fl.insert_after(fl.begin(), 11);
    fl.pop_front();// 在開頭刪除元素
    fl.remove(11);// 刪除元素

    return 0;
}

雙向鏈表

在這裏插入圖片描述

int main ()
{
    list<int> ll;
    ll.push_back(12);// 在末尾添加元素
    ll.push_front(10);// 在開頭添加元素
    ll.back();// 讀取末尾元素
    ll.front();// 讀取開頭元素
    ll.push_back(12);
    ll.unique();// 刪除重複元素
    cout<<ll.size()<<endl;
    ll.pop_front();// 在末尾刪除元素
    ll.pop_back();// 在開頭刪除元素

    return 0;
}

在這裏插入圖片描述
常見的樹有二叉樹、二叉搜索樹、二叉平衡樹、紅黑樹等。

C++ 中的 set multiset map multimap 是用二叉搜索樹實現的,這種數據結構支持二分搜索,所以增刪改查的複雜度都是O(logn)。

set

類似數學中的集合,set 中不能包含重複的元素,元素是排好序的,且不能被修改。

int main ()
{
    set<int, less<int>> ss;// 由小到大排序
    ss.insert(12);
    ss.insert(10);
    for(auto itr=ss.cbegin(); itr!=ss.cend(); itr++)cout<<*itr<<endl;// 輸出 10 12
    ss.erase(ss.cbegin());// 擦除首元素
    ss.count(13);// 元素 13 的個數,0 或 1
    ss.find(10);// 查找元素 12,返回迭代器,若沒找到返回 ss.end()

    return 0;
}
multiset

與 set 類似,但可以包含重複元素

int main ()
{
    multiset<int, less<int>> ms;// 由小到大排序
    ms.insert(12);
    ms.insert(10);
    ms.insert(10);
    for(auto itr=ms.cbegin(); itr!=ms.cend(); itr++)cout<<*itr<<endl;// 輸出 10 10 12
    cout<<""<<endl;
    auto pp = ms.equal_range(10);
    for(auto itr=pp.first; itr!=pp.second; itr++)cout<<*itr<<endl;// 輸出 10 10
    ms.lower_bound(10);// = pp.first
    ms.upper_bound(10);// = pp.second

    return 0;
}
map
int main ()
{
    map<int, int> mm;
    mm[1] = 1;// 插入元素 (1,1)
    mm.insert(make_pair(2,2));// 插入元素 (2,2)
    for(auto itr=mm.cbegin(); itr!=mm.cend(); itr++)
        cout<<"("<<itr->first<<","<<itr->second<<")"<<endl;// 輸出 (1,1) (2,2)

    return 0;
}
multimap
int main ()
{
    multimap<int, int> mm;
    mm.insert(make_pair(1,10));// 插入元素 (1,10)
    mm.insert(make_pair(1,11));// 插入元素 (1,11)
    mm.insert(make_pair(2,2));// 插入元素 (2,2)
    for(auto itr=mm.cbegin(); itr!=mm.cend(); itr++)// 遍歷所有元素
        cout<<"("<<itr->first<<","<<itr->second<<")"<<endl;// 輸出 (1,10) (1,11) (2,2)
    for(auto itr=mm.lower_bound(1); itr!=mm.upper_bound(1); itr++)// 遍歷 key=1 的元素
        cout<<"("<<itr->first<<","<<itr->second<<")"<<endl;// 輸出 (1,10) (1,11)
    mm.erase(1);// 刪除所有 key=1 的元素
    mm.erase(mm.cbegin());// 刪除第一個元素

    return 0;
}

映射

在這裏插入圖片描述

映射類似數學中的函數,每一個 key 對應一個 value,寫成函數表達式爲:value=f(key),其中 f 被稱爲哈希函數。

C++11 中的 unordered_set unordered_multiset unordered_map unordered_multimap 是用映射實現的,這種數據結構可以在O(1)的時間複雜度下訪問單個元素,效率高於二叉搜索樹(O(logn)),但是遍歷元素的效率比二叉搜索樹低。

  1. unordered_set

接口與 set 類似,不在贅述

  1. unordered_multiset

接口與 multiset 類似,不在贅述

  1. unordered_map

接口與 map 類似,不在贅述

  1. unordered_multimap

接口與 multimap 類似,不在贅述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章