C++ 資料結構 (Data Structure)

資料結構:電腦儲存資料的方式,例如陣列。

Vector 向量

    vector<int> v = {1, 2, 3};
    v.push_back(4);
    v.pop_back();
    vector<int> v2 = v; //複製整份
    vector<int> v3(v.begin()+1, v.end()-1); //複製指定範圍{2}
    int a[3] = {1, 2, 3};
    vector<int> v5(a, a+3); //陣列轉vector
    vector<int> v6(a+1, a+2); //也可以複製指定範圍{2}

Stack 堆疊

  • 疊盤子,後進先出。

Queue 佇列

  • 排隊,先進先出。

Deque 雙端佇列

  • 念作 “deck”。
  • stack+queue=deque.

Linked List 連接串列

  • 對每個資料紀錄前後資料的位置。
  • 可以 O(1) 加入、刪除特定資料。
  • 不能 O(1) 存取指定 index 的資料。

pair

pair:只有兩個參數的 struct。

#include <utility>

pair<int, int> p;
p = make_pair(5, 3);
p = {5, 3};
cout << p.first << ' ' << p.second;

Heap 堆積

  • 一個能維護極值(最大值)的資料結構。
  • 功能:存取、刪除 heap 最頂端(極值)的資料。
  • 複雜度:O(log N)
  • STL提供的 heap 叫做 priority_queue。
  • Binary Heap Tree
#include <queue>
priority_queue<int> heap;

Set 集合

  • Set = 集合 = 元素不重複
  • 有排序的。
  • 可以插入(insert)、刪除(erase)、尋找(find)資料。
  • set.count(87) 回傳該元素是否存在。
  • 可以利用 prev() , next() 得到前後的 iterator。
  • 尋找值大於等於自己的第一個 iterator:set.lower_bound(87);
  • 尋找值大於自己的第一個 iterator:set.upper_bound(87);
  • Disjoint Set 併查集:詢問兩元素是否在同一集合、合併兩個元素所在的集合。
for(set<int>::iterator i=s.begin(); i!=s.end(); i++){
  cout << *i << endl;
}

Map

  • 一個 key 對到一個 value,key 不可重複,value 可以重複。
  • Map 會自動按照 key 排序。
// 宣告
map<string, int> m;
// 插入
m.insert(make_pair("Apple", 3));
m["Banana"] = 5;
// 遍歷
for(auto pair : m){
    cout << pair.first << ' ' << pair.second << endl;
}
// 刪除
m.erase("Banana");
// 尋找
auto it = m.find("Banana");
if(it != m.end()){
    cout << it->second << endl;
}else{
    cout << "Not found.\n";
}
發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *