複習C++系列---STL之Vector

1.什麼是STL

  STL(Standard Template Library)標準模板庫的簡稱,是由惠普開發的一系列軟件的總稱,STL現在是C++的一部分,已經被構建於編譯系統之內,所以不需要再引入。

2.STL的組成部分

  • 容器(containers):是一種數據結構容器,使用類模板的方式提供,我們可以方便的進行數據的存儲操作。
  • 適配器(adapters):以序列式容器爲基礎,提供的棧,隊列和優先級隊列的這種容器。
  • 迭代器(iterators):類似於指針,用來操作容器的對象。
  • 算法(algorithm):包含一系列的常見算法。
  • 空間配置器(allocator):其中主要工作包括兩部分:1,對象的創建與銷燬。2,內存的創建與釋放。
  • 仿函數(functor):仿函數又稱爲函數對象,其實就是重載了()操作符的struct,沒有什麼特別的地方。

二,STL的容器

1,序列式容器

  • 每個元素都有固定位置,取決於插入時機和地點。與元素值無關。
  • vector(向量):底層數據結構是數組,可以隨機存取數據元素(用索引直接存取),數組的尾部添加和移除元素很快,但在頭部和中部插入元素比較耗時。
  • deque(雙端隊列):底層數據結構是數組,可以隨機存取數據元素,在數組的頭部和尾部插入和刪除元素很快。
  • list(列表):底層數據結構是雙向鏈表,不提供隨機存取數據元素(需要按順序走到要存取的元素),在任何位置插入和刪除都很快,只需要簡單的移動一下指針。

2,關聯式容器

  • 元素位置取決於特定的排序準則,和插入的順序無關,底層數據結構爲二叉樹。
  • set(集合):內部元素依據其值自動排序,set內相同的數值元素只能出現一次。
  • multiset(多重集合):內部元素依據其值自動排序,set內允許出現重複的元素。
  • map(映射):map的元素是成對的鍵值對,內部元素的值依據鍵自動排序,鍵只允許出現一次。
  • multimap(多重映射):多重映射是map的增強版,允許鍵出現多次。

三,STL的適配器

1.什麼是適配器

  STL提供了三種適配器stack,queue和priority_queue。這些適配器是包裝了序列式容器(vector,deque,list)中的一種。因此所謂的適配器就是序列式容器的包裝器,注意:適配器沒有提供迭代器。

2.stack(棧)

  棧可以使用序列式容器中的vector,deque,list中的任意一種作爲其底層的數據結構。默認是使用deque來實現的stack。

3.queue(隊列)

  隊列可以使用deque和list中的任意一種作爲其底層的數據結構。默認是使用deque來實現的queue。

4.priority_queue(優先隊列)

  優先隊列也是一種隊列,不過在進入隊列之後會對元素進行排序,可以使用vector和deque來實現其底層結構,默認是使用vector來實現priority_queue。

5.序列式容器和適配器比較


Vector是同一種類型的對象的集合,每個對象都有一個對應的整數索引值。Vector的數據安排及操作方式與array非常相似,唯一的差別在於array是靜態空間,一旦配置了就不能改變;vector是動態空間,隨着元素的加入,它的內部機制會自行擴充空間以容納新元素。 vector不是一種數據類型,而只是一個類模版,可以用來定義多種數據類型。在定義了vector對象之後,vector類型的每一種都指定了其保存元素的類型。

vector的底層實現是數組,相比於數組,vector的優點是支持動態分配空間;缺點是如果在非尾部進行插入或者刪除,效率比較低。

使用vector之前,必須包含相應的頭文件和命名空間:
#include <vector>
using std::vector //也可直接使用using namespace std;

(1)vector常見操作:

v1.push_back()   //在數組的最後添加一個數據
v1.pop_back()    //去掉數組的最後一個數據 
v1.front()     //返回第一個元素(棧頂元素)
v1.begin()           //得到數組頭的指針,用迭代器接受
v1.end()             //得到數組的最後一個單元+1的指針,用迭代器接受
v1.clear()        // 移除容器中所有數據
v1.empty()         //判斷容器是否爲空
v1.erase(pos)        //刪除pos位置的數據
v1.erase(beg,end)// 刪除[beg,end)區間的數據
v1.size()         //回容器中實際數據的個數
v1.insert(pos,data) //在pos處插入數據
v1.assign(beg,end)    //將[beg,end)一個左閉右開區間的數據賦值給c。
v1.assign (n,elem)    //將n個elem的拷貝賦值給c。
v1.at(int index)      //傳回索引爲index的數據,如果index越界,拋出out_of_range異常。
v1.capacity()         //返回容器中數據個數,翻倍增長。
v1.back()             //傳回最後一個數據,不檢查這個數據是否存在。
v1.resize(num)        //重新指定隊列的長度。(往往用來增加vector的長度,小->大 ok 大->小 沒用!)
vector<type>c;創建一個空的vector容器。

vector<type> c1(c2);複製一個vector。

vector<type> c(n);創建一個vector,含有n個數據,數據均以缺省構造產生,即全0;

vector<type> c(n,elem)創建一個vector,含有n個elem的拷貝數據。

vector<type> c(beg,end)創建一個以[beg,end)區間的vector。

~vector<type>()   銷燬所有數據,施放內存。

(2)操作實例

#include <iostream>
#include <vector>
using namespace std;
//打印
void print(vector<int>v)
{
        vector<int>::iterator it;
        //使用迭代器遍歷
        for(it = v.begin();it != v.end();it++)
        {
                cout<<*it<<" ";
        }
        cout<<endl;

}
int main()
{
        vector<int>v;
        vector<int>::iterator it;

        //1.添加元素
        for(int i = 0;i < 10;i++)
        {
                v.push_back(i);
        }

        //2.元素個數
        cout<<"when push,"<<"count="<<v.size()<<endl;

        //3.取第一個元素
        cout<<"取第一個元素:"<<v.front()<<endl;

        //4.使用迭代器打印
        print(v);

        //5.刪除指定位置的元素
        it = v.end();
        it-=2;
        v.erase(it);
        print(v);

        //6.刪除一定範圍內的元素(begin,end)
        it-=3;
        v.erase(it,it+1);
        print(v);
        it = v.begin();

        //7.在指定位置插入元素
        v.insert(it,100);
        print(v);


        //8.依次刪除所有元素
        for(int i = 0;i < v.size();i++)
        {
                v.pop_back();
        }
        cout<<"when pop,"<<"count="<<v.size()<<endl;

        //9.判斷是否已經爲空
        if(v.empty())
        {
                cout<<"此時數組爲空!"<<endl;
        }
        else
        {

                cout<<"此時數組爲不空!"<<endl;
        }
        return 0;
}

輸出:


發佈了20 篇原創文章 · 獲贊 22 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章