演算法常用STL整理
阿新 • • 發佈:2020-11-01
演算法常用STL
vector
標頭檔案:#include<vector>
vector是一個可變長度的陣列,支援隨機訪問,不支援任意位置的O(1)插入,末尾可以進行O(1)插入。
- vector的定義
struct student{
int sid;
string name;
int age;
int cid;
// ...
}
vector<int> a;
vector<int> b[233]; //b[i] 是一個size=0 的vector
// 每一個vector的size為0.
vector<student> students;
- 初始化
vector<int> a({1,2,3}); vector<int> a = {1,2,3}; vector<int> abc(10); // 10 個 val = 0 vector<int> abc(10,1); // 10 個 val = 1 // 通過陣列初始化 int a[5] = {1,2,3,4,5}; vector<int> b(a,a+5); // 通過同類型vector初始化 vector<int> a(5,1); vector<int> b(a); vector<int> b(a.begin()+1,a.end()-1); vector<int> b = a; // insert初始化 vector<int> b; b.insert(b.begin(),a.bein(),a.begin()+3); // 將a[0]-a[3]給b,b.size() -> 3, a是同類型的vector b.insert(b.begin(),a,a+6); // a是陣列 b.insert(b.begin(),6,6); // 插入6個6; // copy 初始化 vector<int> a(5,1); // 5個1 int a1[5] = {2,2,2,2,2}; vector<int> b(10); /*將a中元素全部拷貝到b開始的位置中,注意拷貝的區間為a.begin() ~ a.end()的左閉右開的區間*/ copy(a.begin(), a.end(), b.begin()); //拷貝區間也可以是陣列地址構成的區間 copy(a1, a1+5, b.begin() + 5);
- 常用函式
vector<int> a; a.size(); a.empty(); a.clear(); // 迭代器 vector<int>::iterator it = a.begin(); // *it = a[0]; // *(it+2) = a[2]; *it; //去迭代器的值 a.end(); // a的最後一個位置的下一個位置。 *a.begin(); // 就是a[0] // [begin,end) a.front(); // == a[0] == *a.begin(); a.back(); // == a[a.size() - 1]; a.push_back(); a.pop_back();
- 遍歷
for(int i = 0; i < a.size(); i ++) //..
for(vector<int>::iterator it = a.begin(); it != a.end(); it ++) // .. it != a.end(); 可以寫成 it < a.end();
for(auto it = a.begin(); it != a.end(); it ++) //...
for(int x : a) //..
for(auto x : a) //..
vector採用倍增方法,假設需要插入n個元素,那麼一共需要拷貝\(\frac{n}{2}+\frac{n}{4}+\frac{n}{8}+... = (\frac{1}{2}+\frac{1}{4}+\frac{1}{8}) * n < n\) 所以平均來看,效率並不差。
刪除是\(O(N)\)的複雜度。
queue
檔案頭:#include<queue>
標頭檔案queue中包含了迴圈佇列queue
和優先佇列priority_queue
queue
是先進先出,priority_queue
保證每次pop
的都是max—val,預設是大根堆。
- 定義
queue<int > a;
priority_queue<int> a;//大根堆
priority_queue<int,vector<int>,greater<int>> b;//小根堆
priority_queue<pair<int,int>>;
// 自定義結構體作為優先佇列的型別需要過載 < (小根堆需要過載大於號)
struct Rec{
int a,b;
bool operator< (const Rec& t) const {
return a > t.a;
}
}
- 常見方法
//迴圈佇列
q.push(1); //對頭插入
q.pop();// 彈出隊尾
q.front();// 隊頭
q.back(); // 隊尾
// 優先佇列
a.push(1) // 自動調整順序
a.top(); // 獲取max-val
a.pop(); // 刪除max-val
/*
沒有clear();
queue, priority_queue, stack 沒有clear()函式。
*/
if want clear do follow
a = queue<int>(); //re-init
stack
標頭檔案: #include<stack>
先進後出FILO
- 使用
stack<int> stk;
stk.push(1);
stk.top();
stk.pop();
deque
deque 是雙端佇列,無限制的佇列,隊尾對頭都可以插入和彈出操作。