1. 程式人生 > 實用技巧 >演算法常用STL整理

演算法常用STL整理

演算法常用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 是雙端佇列,無限制的佇列,隊尾對頭都可以插入和彈出操作。