STL之vector--第一篇部落格
STL(Standard Template Library)是C++的標準模板庫,方便靈活地使用STL將節省大量工作,減少不必要寫的程式碼。接下來我們來看看STL裡動態陣列vector的使用。
當我們不確定陣列的大小,開個大陣列又擔心浪費空間時,我們就需要了解了解神奇的動態陣列了。而STL裡的vector(向量)就是實現動態陣列的不二之選。
一,vector的簡介
vector是一個模板類,要用#include<vector>來將vector包含到程式中,要注意的是STL提供的vector只是個模板,需要vector<int>或vector<double>這樣的方式來宣告一個指定動態陣列的型別,訪問元素(賦值或寫入)時,可以與陣列一樣使用“[ ]”運算子。
函式名 | 功能 |
push_back(x) | 在向量末新增元素 |
pop_back() | 刪除向量的最後一個元素 |
begin() | 返回指定向量開頭的迭代器 |
end() | 返回指定向量末尾(最後一個元素的後一個位置)的迭代器 |
front() | 返回第一個資料 |
back() | 返回最後一個數據 |
size() | 返回向量的元素數 |
clear() | 刪除向量中所有元素 |
empty() | 判斷容器是否為空 |
insert(p, x) | 在向量的位置p處插入元素x |
二,vector的實戰
接下來引用一個簡單有用的例子來進一步闡述https://www.hackerrank.com/challenges/reduced-string/problem
題目描述:steve想縮短一個字串,具體操作就是每次刪除一對鄰接相同的字元,求最終得到的最短的字串,如果啥都沒剩下輸出“Empty String”。
輸入:一個長度在0到100之間的字串
輸出:最短字串或者“Empty String”
題解:
因為刪除了相鄰的字元後又會有新的字元相鄰,不停的刪就會不停的變動,符合動態的特徵,故使用STL的vector物件就可以開開心心地AC了。開個字元型的動態陣列vector<char> st,從頭開始掃描字串,將滿足條件的字元存入st,最終輸出st即可。顯然最關鍵的步驟就是st裡的元素怎麼變動。
for (int i = 0; i < (int)s.length(); i++)
遍歷字串s,如果陣列為空,毫不猶豫地將s[i]放入陣列st,否則判斷s[i]是否和st.back()相同(st.back()為儲存在st裡的字串的最後一個字元),如果相同則st.pop(),否則st.push_back(s[i])。最終判斷一下st陣列是否為空,輸出“Empty String”還是剩下的新生成的字串。此處庫函式的st.pop_back(), st.push_back(s[i]), st.empty()以及st.size()是不是用起來賊爽!
vector實現:
#include<bits/stdc++.h> using namespace std; int main() { string s; cin>>s; vector<char>st; for (int i = 0; i < (int)s.length(); i++) { if (!st.empty() && st.back() == s[i]) { st.pop_back(); } else { st.push_back(s[i]); } } if (st.empty()) { cout<<"Empty String"<<endl; } else { for (int i = 0; i < (int)st.size(); i++) { cout<<st[i]; } cout<<endl; } return 0; }