STL vector 介紹連載1-2-3

STL簡介:
STL = Standard Template Library,標準模板庫,惠普實驗室開發的一系列軟件的統稱。它是由Alexander Stepanov、Meng Lee和David R Musser在惠普實驗室工做時所開發出來的。這多是一個歷史上最使人興奮的工具的最無聊的術語。從根本上說,STL是一些「容器」的集合,這些「容器」有list,vector,set,map等,STL也是算法和其餘一些組件的集合。這裏的「容器」和算法的集合指的是世界上不少聰明人不少年的傑做。STL的目的是標準化組件,這樣就不用從新開發,可使用現成的組件。STL如今是C++的一部分,所以不用額外安裝什麼。
STL被內建在你的編譯系統以內。
在C++標準中,STL被組織爲下面的13個頭文件:<algorithm>、<deque>、<functional>、<iterator>、<vector>、<list>、<map>、<memory>、<numeric>、<queue>、<set>、<stack>和<utility>。ios

STL通常包括六大組件:
容器,算法,迭代器,仿函式,配接器,配置器。程序員

vector簡介:
vector是C++標準模板庫中的部份內容,中文偶爾譯做「容器」,但並不許確。它是一個多功能的,可以操做多種數據結構和算法的模板類和函數庫。vector之因此被認爲是一個容器,是由於它可以像容器同樣存放各類類型的對象,簡單地說,vector是一個可以存聽任意類型的動態數組,可以增長和壓縮數據。
算法

 

/*- ==========================================================
*     文件名  :vector1.cpp
*     開發人員:袁培榮
*     當前版本:1.0.0.2595
*     建立時間:2012-05-20
*     修改時間:2012-05-20
*     功能說明:STL vector 介紹連載1
*     版權說明:版權全部 袁培榮 YuanPeirong 
*     編譯環境:Windows 7(x64) SP1 簡體中文專業版
*     編譯器:  Visual Studio 2010 SP1(中文旗艦版)
                MinGW 20120426 GNU GCC 4.6.2(主力編譯器)
                Visual C++ 6.0 SP6(中文企業版)
- ==========================================================*/

#include <iostream>
#include <vector>  //包含STL 的vector 頭文件才能使用vector

using std::cout;
using std::endl;
using std::vector; //vector是一個類模板,定義在命名空間std裏面

int main(int argc, char* argv[])
{
    //vector類的四種構造方法
    vector<int> v1;       //默認構造函數,v1爲空
    vector<int> v2(v1);   //v2構造爲v1的一個副本
    vector<int> v3(10,5); //v3包含10個值爲5的元素
    vector<int> v4(10);   //v4包含含有初始化值的元素的10個副本
    
    //用.size()成員函數取得各vector對象包含的元素個數,並輸出
    vector<int>::size_type l1=v1.size(); //.size()函數的返回類型爲:
    vector<int>::size_type l2=v2.size(); //vector<T>::size_type
    vector<int>::size_type l3=v3.size(); //不過也能夠用int型來接收
    vector<int>::size_type l4=v4.size(); //但建議用標準類型vector<T>::size_type

    cout<<"l1="<<l1<<endl;
    cout<<"l2="<<l2<<endl;
    cout<<"l3="<<l3<<endl;
    cout<<"l4="<<l4<<endl;
    
    //輸出各vector對象包含的元素的值
    vector<int>::size_type i;
    
    cout<<endl<<"輸出v1值"<<endl;
    for(i=0; i!=v1.size(); i++)     //C++程序員習慣於!=來進行判斷
        cout<<v1[i]<<" ";           //而非<或>或<=或>=
                                    //這種用!=的方式更加科學和安全
    cout<<endl<<"輸出v2值"<<endl;   //這裏,雖然v1,v2是空的
    for(i=0; i!=v2.size(); i++)     //但for循環不會出錯
    cout<<v2[i]<<" ";               //只是循環體一次也不執行就結束for循環
    
    cout<<endl<<"輸出v3值"<<endl;
    for(i=0; i!=v3.size(); i++)    
        cout<<v3[i]<<" ";           //另外,咱們能夠經過 對象名[下標]
                                    //的方法來訪問vector對象中各元素的值
    cout<<endl<<"輸出v4值"<<endl;   //下標從0開始,到 長度-1 結束
    for(i=0; i!=v4.size(); i++)     
        cout<<v4[i]<<" ";
        
    v3[5]=35;                      //對象名[下標] 的方式可做右值,也可做左值
    cout<<endl<<"v3[5]="<<v3[5]<<endl;
    
    return 0;
}

//=========================
// 運行結果:
//=========================
// l1=0
// l2=0
// l3=10
// l4=10

// 輸出v1值

// 輸出v2值

// 輸出v3值
// 5 5 5 5 5 5 5 5 5 5 
// 輸出v4值
// 0 0 0 0 0 0 0 0 0 0 
// v3[5]=35
//=========================
/*- ==========================================================
*     文件名  :vector2.cpp
*     開發人員:袁培榮
*     當前版本:1.0.0.2595
*     建立時間:2012-05-20
*     修改時間:2012-05-20
*     功能說明:STL vector 介紹連載2
*     版權說明:版權全部 袁培榮 YuanPeirong 
*     編譯環境:Windows 7(x64) SP1 簡體中文專業版
*     編譯器:  Visual Studio 2010 SP1(中文旗艦版)
                MinGW 20120426 GNU GCC 4.6.2(主力編譯器)
                Visual C++ 6.0 SP6(中文企業版)
- ==========================================================*/

#include <iostream>
#include <vector>  //包含STL 的vector 頭文件才能使用vector

using std::cout;
using std::endl;
using std::vector; //vector是一個類模板,定義在命名空間std裏面

int main(int argc, char* argv[])
{
    vector<int> v1;
    vector<int> v2(10);

    //.empty()成員函數返回對象是不是空的
    bool bv1=v1.empty(); //若是爲空,返回ture
    bool bv2=v2.empty(); //若是不爲空,返回flase
    cout<<"測試empty()成員函數"<<endl;
    if(bv1) 
        cout<<"v1是空的"<<endl;
    else
        cout<<"v1不是空的"<<endl;

    if(bv2) 
        cout<<"v2是空的"<<endl;
    else
        cout<<"v2不是空的"<<endl;

    // "==" 操做符用來判斷兩個對象是否相等        
    // 同時 !=, <, >, <=, >=這些操做符保持有慣有含義 
    cout<<"測試 == 操做符"<<endl;
    if(v1==v2)
        cout<<"v1與v2相同"<<endl;   //若是相等返回true
    else
        cout<<"v1與v2不相同"<<endl; //若是不相等返回false    
        

    //"=" 操做符可用於對象間賦值
    v1=v2; //把v1的元素替換爲v2中的元素的副本
           //此時v1再也不爲空,而是和v2相等,證實以下
    bv1=v1.empty();
    cout<<"測試 = 操做符"<<endl;    
    if(bv1) 
        cout<<"v1是空的"<<endl;
    else
        cout<<"v1不是空的"<<endl;
    if(v1==v2)
        cout<<"v1與v2相同"<<endl;   
    else
        cout<<"v1與v2不相同"<<endl;
        
    return 0;
}

//=========================
// 運行結果:
//=========================
// 測試empty()成員函數
// v1是空的
// v2不是空的
// 測試 == 操做符
// v1與v2不相同
// 測試 = 操做符
// v1不是空的
// v1與v2相同
//=========================

/*- ==========================================================
*     文件名  :vector3.cpp
*     開發人員:袁培榮
*     當前版本:1.0.0.2595
*     建立時間:2012-05-20
*     修改時間:2012-05-20
*     功能說明:STL vector 介紹連載3
*     版權說明:版權全部 袁培榮 YuanPeirong 
*     編譯環境:Windows 7(x64) SP1 簡體中文專業版
*     編譯器:  Visual Studio 2010 SP1(中文旗艦版)
                MinGW 20120426 GNU GCC 4.6.2(主力編譯器)
                Visual C++ 6.0 SP6(中文企業版)
- ==========================================================*/

#include <iostream>
#include <vector>  //包含STL 的vector 頭文件才能使用vector

using std::cout;
using std::endl;
using std::vector; //vector是一個類模板,定義在命名空間std裏面

int main(int argc, char* argv[])
{
    vector<int> v1(1);
    vector<int> v2(10);

    //下標操做不能用於添加元素,由於下標越界不容許
    //下面是演示,由於是錯誤代碼,由於被註釋
    //下面想經過下標操做爲v1加入5個元素,這是非法的
    //並且這種錯誤在編譯時是不報錯的,但在運行時會出錯
    //顯然這種錯誤更可怕
    //=====錯誤代碼起
    // for(vector<int>::size_type i=1; i!=6; i++)
        // v1[i]=i;
    //=====錯誤代碼止
    //其實這種錯誤就是下標越界
    //由於v1只存在 v1[0] 而v1[1]到v[5]是不存在的,由於是不能訪問的
    //由於系統沒有爲它們分配內存空間,根本訪問不到
    
    //正確添加元素,咱們要用到.push_back(t)成員函數
    //.push_back(t)接受一個元素值t,並將其添加到對象的最後面
    cout<<"測試push_back(t)成員函數"<<endl;
    cout<<"添加前:"<<endl;
    cout<<"v1[0]="<<v1[0]<<endl;
    for(vector<int>::size_type j=1; j!=6; j++)
    {    
        v1.push_back(j);
        cout<<"添加v1["<<j<<"]="<<v1[j]<<endl;
    }
    
    return 0;
}

//=========================
// 運行結果:
//=========================
// 測試push_back(t)成員函數
// 添加前:
// v1[0]=0
// 添加v1[1]=1
// 添加v1[2]=2
// 添加v1[3]=3
// 添加v1[4]=4
// 添加v1[5]=5
//=========================

//=========================
//總結:
//=========================
//vector是C++標準中STL組件的核心內容之一
//它採用最新的泛型編程技術實現,其本質是一個類模板
//vector能夠用來替換不安全的數組操做
//而且它能夠動態的增減元素
//(這裏沒有演示減,主要是要和後面的迭代器一塊兒介紹)
//這是數組所不能作到的。
//相比JAVA的vector的增減機制,C++的vector更加靈活和科學
//數組能夠配合指針進行靈活操做,這一點Java的數組不行
//而C++的vector能夠配合迭代器進行更靈活操做,這一點Java的vector不行
//C++的vector和迭代器能夠很好地替代不安全的數組和指針
//咱們在編程時要儘可能不用數組,能用迭代器的地方可用其代替指針
//而儘量的採用vector和迭代器
//固然,數組能夠不用,指針仍是不能被取代的
//C++99標準的推出了智能指針
//而C++11標準更是推出了兩個更加智能的指針 
//=========================
//接下去,將介紹迭代器和vector的配合使用。
//=========================
相關文章
相關標籤/搜索