C++標准模板庫(STL)之Vector


 在C中,有很多東西需要自己實現。C++提供了標准模板庫(Standard Template Libray,STL),其中封裝了很多容器,不需要費力去實現它們的細節而直接調用函數來實現功能。

具體容器鏈接:setstringmapqueuepriority_queuestackpair

1、vector的用法

  vector:向量,這里叫“變長數組”,長度根據需要而自動改變的數組。有時會碰到普通數組會超過內存的情況,可以使用vector解決。而且,vector可以用來以鄰接表的方式存儲圖,可以解決當節點數太多,無法使用鄰接矩陣,又害怕使用指針實現鄰接表的時候,使用很簡單。

  使用vector,需要添加頭文件,#include<vector>,還要頭文件下加入using namespace std;

1.1、vector的定義

vector<typename> name;

相當於定義了一個一維數組name[SIZE],只不過size可以根據需要進行變化,比較節省空間,也就是變長數組

typename:任何基本類型,int,char,double,結構體,STL容器vector,set,queue等。

如果typename是STL容器,定義的時候要在>>之后加上空格,如果不加空格,編譯器就把它認為是位操作。

vector<int> stu;
vector<double> stu;
vector<char> stu;
vector<Node> stu;//Node是結構體類型
vector<vector<int>> name;

二維數組的定義:一維是一個數組的數組

vector<typename> Arrayname[arraySize]
/*Arrayname[]的每一個元素都是一個vector,可以理解為兩個維都是可變長的二維數組*/
寫法一:vector<int> vi[100];//一維長度已經固定為arraySize
vi[0]~vi[99]中每一個都是一個vector容器。
寫法二:vector<vector<int>> vi//區別:這個兩個維度是變長的

1.2、vector容器內元素的訪問

  vector訪問方式:下標訪問、迭代器訪問。

  1.2.1、下標訪問

  和訪問普通數組一樣,下標從0~size()-1。

  比如定義的:vector<typename> vi,使用vi[index](vi[0],vi[1])。

  1.2.2、通過迭代器訪問

  迭代器(iterator)理解為類似指針的東西。

  定義:vector<typename>::iterator it;//it是一個迭代器變量。

#include<stdio.h>
#include<vector>
using namespace std;
int main()
{
    vector<int> vi;
    for(int i=0;i<5;i++)
    {
        vi.push_back(i);
    }
    vector<int>::iterator it=vi.begin();//vi.begin()是vi的首元素地址,用迭代器變量it指向這個地址
    for(int i=0;i<5;i++)
    {
        printf("%d\n",*(it+i));//輸出vi[i];
    }
    return 0;
}
View Code

注:vi[i]與*(vi.begin()+i)等價

end()函數:並不是取vi的尾元素地址,而是取尾元素的下一個地址。就相當於左閉右開區間。

#include<stdio.h>
#include<vector>
using namespace std;
int main()
{
    vector<int> vi;
    for(int i=0;i<5;i++)
    {
        vi.push_back(i);
    }
    vector<int>::iterator it=vi.begin();//vi.begin()是vi的首元素地址,用迭代器變量it指向這個地址
    for(int i=0;i<5;i++)
    {
        printf("%d\n",*(it+i));//輸出vi[i];
    }
    //使用begin(),end()函數,訪問
    for(vector<int>::iterator it=vi.begin();it!=vi.end();it++)
    {
        printf("%d\n",*it);
    }
    return 0;
}
View Code

注:在常用STL容器中,只有vector和string才可以使用vi.begin()+i這種迭代器加整數的寫法,因為他們兩個看做數組的下標的訪問方式。

1.3、vector常用函數

  1.3.1、push_back()函數

push_back(x)就是在vector后面添加一個元素x,時間復雜度為O(1)。

  1.3.2、pop_back()函數

pop_back(x)就是刪除vector的尾元素x,時間復雜度為O(1)。

  1.3.3、size()函數

用來獲得vector中元素的個數,時間復雜度為O(1)。

  1.3.4、clear()函數

用來清空vector所有的元素,時間復雜度為O(N),N為元素總個數。

  1.3.5、insert()函數

用insert(it,x)往vector的任意迭代器it初傳入一個元素x。時間復雜度為O(N)。

  1.3.6、erase()函數

用erase()函數刪除單個元素,或者一個區間的元素

#include<stdio.h>
#include<vector>
using namespace std;
int main()
{
    vector<int> vi;
    for(int i=0;i<5;i++)
    {
        vi.push_back(i);//jpush_back()函數應用
    }
    vi.pop_back(i);//刪除vi的尾部元素4
    int i=vi.size();//size()返回的unsingned類型
    vi.clear();//清空vector所有元素
    vi.insert(vi.begin()+2,23);//將23插入vi[2]的位置
    vi.erase(vi.begin()+1);//刪除單個元素vi[1];
    vi.erase(vi.begin()+1,vi.begin()+3);//刪除vi[1],vi[2],左閉右開區間    
    return 0;
}
View Code

1.4、vector常見用途

  1.4.1、存儲數據

vector本身可以作為數組使用,當元素個數不確定的時候,可以很好地節省空間。

有些時候需要把部分數據輸出在同一行,用空格隔開數據。由於數據的個數不知道,

可以使用vector記錄所有的需要輸出的數據,然后一次性輸出。

  1.4.2、用鄰接表存儲圖

可以使用vector實現鄰接表,避免使用指針的鄰接鏈表。

 

 

2018-09-25 14:24:20                                                                 @author:Foreordination

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM