1. 程式人生 > >STL之vector--第一篇部落格

STL之vector--第一篇部落格

 

STL(Standard Template Library)是C++的標準模板庫,方便靈活地使用STL將節省大量工作,減少不必要寫的程式碼。接下來我們來看看STL裡動態陣列vector的使用。

當我們不確定陣列的大小,開個大陣列又擔心浪費空間時,我們就需要了解了解神奇的動態陣列了。而STL裡的vector(向量)就是實現動態陣列的不二之選。

一,vector的簡介

vector是一個模板類,要用#include<vector>來將vector包含到程式中,要注意的是STL提供的vector只是個模板,需要vector<int>或vector<double>這樣的方式來宣告一個指定動態陣列的型別,訪問元素(賦值或寫入)時,可以與陣列一樣使用“[ ]”運算子。

vector的成員函式示例 
函式名 功能
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;
}