C++ STL初學------Vector向量容器

vector是C++標準模板庫中的部分內容,中文偶爾譯作“容器”,但並不準確。
它是一個多功能的,能夠操作多種數據結構和算法的模板類和函數庫。
vector之所以被認爲是一個容器,是因爲它能夠像容器一樣存放各種類型的對象,
簡單地說,vector是一個能夠存放任意類型的動態數組,能夠增加和壓縮數據。------摘自Vector百度百科介紹

Vector向量容器優點:

1、vector向量容器不但能像數組一樣對元素進行隨機訪問,還能在尾部插入元素,是一種簡單、高效的容器,完全可以取代數組。

2、vector向量容器具有內存自動管理的功能,對於元素的插入和刪除,可動態調整所佔的內存空間。

3、對於vector容器的容量定義,可以事先定義一個固定大小,之後如果不夠用,可以隨時調整其大小;也可以事先不定義,隨時用push_back()方法從尾部擴張元素,也可以使用insert()在某個元素位置前插入新元素。

4、vector向量容器下標是從0開始計數,跟數組的一樣。

Vector向量容器缺點:

時間

運行速度與數組比較更慢。

空間

clear()無法清空內存。------同樣摘自Vector百度百科

首先:使用vector向量容器,需要頭文件包含聲明“#include <vector>”

一、創建vector對象 

創建vector對象常見的有三種形式

1、不指定容器的元素個數,如定義一個用來存儲整形的容器:

vector<int> v;

2、創建時,指定容器的大小,如定義一個用來存儲10個double類型的向量容器:

vector<double> v(10);

注意,元素下標爲0~9;每個元素的值被初始化爲0.0。

3、創建一個具有n個元素的向量容器對象,每個元素具有指定的初始值:

vector<double> v(10,8.6); //定義一個向量容器v,大小爲10,每個元素都是8.6;

二、尾部元素擴張和使用下標方式訪問vector元素

通常使用push_back()對vector容器在尾部追加新元素。追加新元素,vector容器會自動分配新內存空間。

可以對空的vector對象擴張,也可以對已有元素的vector對象擴張。

下標訪問的用法和數組訪問方式類似;

#include <vector>
#include <iostream>
using namespace std;

int main(int argc, char* argv[])
{
    vector<int> v;
    v.push_back(2);        //尾部追加元素
    v.push_back(7);
    v.push_back(9);
    v[3]=2;
    v[4]=7;
    v[5]=9;
    cout<<v[0]<<v[1]<<v[2]<<endl; //下標訪問vector元素
    cout<<v[3]<<v[4]<<v[5]<<endl;   
    return 0;
}

運行結果

279

279

也能用at訪問

#include <vector>
#include <iostream>
using namespace std;

int main(int argc, char* argv[])
{
    vector<int> v;
    v.push_back(2);
    int a=v.at(0);
    cout<<a<<endl;
    return 0;
}

運行結果

 (但是這裏直接v[0]=2;會錯誤,只能用v.push_back(2);實現;)

三、用迭代器訪問vector元素

迭代器的類型要與它遍歷的vector元素類型一致

Vector容器有兩個重要的方法,begin()和end()。begin()返回的是首元素位置的迭代器;end()返回的是最後一個元素的下一元素位置的迭代器。

#include <vector>
#include <iostream>
using namespace std;

int main(int argc, char* argv[])
{
    vector<int> v(3);
    v[0]=2;
    v[1]=7;
    v[2]=9;
    vector<int>::iterator it; //定義迭代器變量,類型爲int
    for(it=v.begin();it!=v.end();it++)
    {
        cout<<*it<<" ";  //輸出迭代器上的元素值
    }
    cout<<endl;
    return 0;
}

運行結果:

2 7 9 

四、元素的插入

insert()方法可以在vector對象的任意位置前插入一個新元素,同時還會擴張一個元素空間,插入後所有元素依次向後挪動一個位置;

這裏使用insert()插入的位置,是元素的迭代器位置,不是下標。

#include <vector>
#include <iostream>
using namespace std;

int main(int argc, char* argv[])
{
    vector<int> v(3);
    v[0]=2;
    v[1]=7;
    v[2]=9;
    v.insert(v.begin(),8);      //在最前面插入新元素8
    v.insert(v.begin()+2,1);    //在迭代器位置爲2的元素前插入新元素1
    v.insert(v.end(),3);        //在向量末尾追加新元素3
    vector<int>::iterator it;   //定義迭代器變量
    for(it=v.begin();it!=v.end();it++)
    {
        cout<<*it<<" ";         //輸出迭代器上的元素值
    }
    cout<<endl;
    return 0;
}

運行結果:

8 2 1 7 9 3

五、元素的刪除

erase()方法可以刪除vector中迭代器所指

的一個元素或一段區間中的所有元素

clear()方法則一次性刪除vector中的所有元素(值得注意的是:上面所說缺點clear()無法清空內存,但是可以刪除元素)

#include <vector>
#include <iostream>
using namespace std;

int main(int argc, char* argv[])
{
    vector<int> v(10);
    for(int i=0;i<10;i++)
    {
        v[i]=i;                     //向量賦值
    }
    v.erase(v.begin()+2);           // 刪除2個元素,從0開始計數
    vector<int>::iterator it;       //定義迭代器變量
    for(it=v.begin();it!=v.end();it++)
    {
        cout<<*it<<" ";             //輸出
    }
    cout<<endl;
    v.erase(v.begin()+1,v.begin()+5);//刪除迭代器從1到5區間的所有元素
    for(it=v.begin();it!=v.end();it++)
    {

        cout<<*it<<" ";             //輸出
    }
    cout<<endl;
    v.clear();                      //清空
    cout<<v.size()<<endl;           //輸出向量大小
    return 0;
}

六、使用reverse反向排列算法

需要頭文件: #include <algorithm>

#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;

int main(int argc, char* argv[])
{
    vector<int> v(10);
    for(int i=0;i<10;i++)
    {
        v[i]=i;             //賦值
    }
    reverse(v.begin(),v.end()); //反向排列向量從頭到尾的元素
    vector<int>::iterator it;   //定義迭代器變量
    for(it=v.begin();it!=v.end();it++)
    {
        cout<<*it<<" ";
    }
    cout<<endl;
    return 0;
}

七、使用sort算法對向量元素進行排序

需要頭文件: #include <algorithm>

默認情況下,升序排列;另外可以自己設計排序比較函數

#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
bool Comp(const int &a,const int &b)// 自己設計的排序比較函數:降序
{
    if(a!=b) return a<b;
    else return a>b;
}
int main(int argc, char* argv[])
{
    vector<int> v;
    int i;
    for(i=0;i<10;i++)
    {
        v.push_back(9-i);
    }
    for(i=0;i<10;i++)
    {
        cout<<v[i]<<" ";
    }
    cout<<endl;
    sort(v.begin(),v.end());   //默認升序
    for(i=0;i<10;i++)
    {
        cout<<v[i]<<" ";
    }
    cout<<endl;
    sort(v.begin(),v.end(),Comp); //降序
    for(i=0;i<10;i++)
    {
        cout<<v[i]<<" ";
    }
    cout<<endl;
    return 0;
}

運行結果:

9 8 7 6 5 4 3 2 1 0

0 1 2 3 4 5 6 7 8 9

9 8 7 6 5 4 3 2 1 0

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章