1. 程式人生 > >C++中STL容器vector的使用

C++中STL容器vector的使用

vetctor的定義

//第一種:不傳引數
vector<int> vint;
vector<char> vchar;
vector<string> vstring;

//第二種:傳一個引數 相當於開闢了一個數組
vector<int> vint2(5);
vector<char> vchar2(5);
vector<string> vstring2(5);

//第三種:引數一 n個元素,每個元素的初值 開闢陣列並進行初始化
vector<int> vint3(5,0);
vector<char> vchar3(5
,'a'); vector<string> vstring3(5,"a"); //第四種:傳一段迭代器區間 vector<int> vint4(vint3.begin(),vint3.end()); vector<char> vchar4(vchar3.begin(),vchar3.end()); vector<string> vstring4(vstring3.begin(),vstring3.end()); //第五種:傳一個物件,既拷貝函式 vector<int> vint5(vint3); vector
<char>
vchar5(vchar3); vector<string> vstring5(vstring3); //第六種:賦值運算子的過載 vector<int> vint6; vector<char> vchar6; vector<string> vstring6; vint6=vint5; vchar6=vchar5; vstring6=vstring5;

vector迭代器定義

//迭代器定義
//begin() end() rbegin() rend() 正向和反向迭代器
std::vector<int>::iterator itint=vint6.begin();                                                                                                        
std
::vector<char>::iterator itchar=vchar6.begin(); std::vector<string>::iterator itstring=vstring.end(); itint =vint6.end(); itchar = vchar.end(); itstring=vstring.end(); std::vector<int>::reverse_iterator ritint =vint6.rbegin(); std::vector<char>::reverse_iterator ritchar = vchar.rbegin(); std::vector<string>::reverse_iterator ritstring=vstring.rbegin(); ritint = vint6.rend(); ritchar = vchar6.rend(); ritstring=vstring.rend(); //cbegin() cend() crbegin() crend() const正向和反向迭代器 std::vector<int>::const_iterator citint=vint6.cbegin(); std::vector<char>::const_iterator citchar=vchar6.cbegin(); std::vector<string>::const_iterator citstring=vstring6.cbegin(); citint=vint6.cend(); citchar=vchar6.cend(); citstring=vstring.cend(); std::vector<int>::const_reverse_iterator critint; std::vector<char>::const_reverse_iterator critchar; std::vector<string>::const_reverse_iterator critstring; critint=vint6.crbegin(); critchar=vchar6.crbegin(); critstring=vstring6.crbegin(); critint=vint6.crend(); critchar=vchar6.crend(); critstring=vstring6.crend();

vector的大小

//用來描述大小的一系列函式
vector<int> test(5,1);
cout<<test.size()<<endl;//表示順序表的元素個數
cout<<test.capacity()<<endl;//表示順序表的容量
cout<<test.max_size()<<endl;//表示容器的最大儲存,但實際到不了
test.resize(1);//設定大小,可以開闢出更多的空間,當引數小於時就銷燬空間
test.resize(10,2);//當大於時就開闢並初始化
cout<<test.size()<<endl;
test.empty();//用來檢查是否為空
test.reserve(10);//用來設定容器大小但是並不初始化,元素個數也沒變,變化不可見
test.shrink_to_fit();//將容器的大小收縮至於元素個數相同的大小

vector的資料操作

//關於元素存取的函式
//operator[] 既過載[]使其類似於陣列元素的操縱,實現隨機訪問
cout<<test.at(1)<<endl;//類似於[]的作用,只是是一個函式行形式
cout<<test.front()<<endl;//顯示存在的第一個元素
cout<<test.back()<<endl;//顯示存在的最後一個元素
int* p = test.data();//取到了一個指向順序表的一個指標
cout<<test.front()<<endl;//顯示存在的第一個元素

//修改動作函式
test.assign(arr,arr+3);//assign替換函式可以替換一個物件的區間或者一個同類型的陣列
test.push_back(4);//尾插,並沒有頭插
test.pop_back();//尾刪                                                                                                                                        
test.insert(it,5);//插入指定位置
test.erase(it);//刪除指定位置
test.swap(test1);//交換函式,將兩個物件進行交換
test.clear();//清空整個順序表
vector<int>::iterator it2=test.emplace(it,5);//類似於insert但是會返回新插入元的迭代器
test.emplace_back(10);//類似於尾插

關於vector的介紹可以分為成員型別、迭代器、元素訪問、建構函式、堆疊操作、表操作、大小和容量、協助函式、以及vector等許多方面,但是本次主要寫的是關於如何使用vector。

簡單介紹

1

每次使用vector時需要包含vector的標頭檔案,在定義一個vector時我們會傳一個引數型別,
如int、char等內部型別,也可以是自定義型別,但是我們需要知道的是其實vector的模板是有
兩個引數的,如圖:

圖一
可以發現vector模板有兩個引數,只是第二個是預設引數。

2

vector的本質上就是一個可以動態增容的陣列,所以其中最為常用的就是對[]的過載,這樣
為了彌補這種缺陷。並且還有一些函式輔助使用,如front(),back(),data(),分別是返

3

每一個容器都存在迭代器,vector也支援,vector的迭代器可以說是非常的簡單,其中就包含 
begin(),end()兩個最常見的迭代器函式,還有靜態的cbegin()和cend()函式和兩個反向操 

4

因為vector是一個有序的容器,所以在某種特定時間也可以作 
為堆疊甚至是表來操作,所以為了更接近堆疊的特徵,vector也包push_back(),pop_back() 
等函式,還有關於表操作的insert(),erase()的函式,還有clear(),swap()兩個函式,可以 
說vector是非常全面的一個容器。 

5

關於大小和容量的問題,vector也有許多成員函式,size(),capacity(),empty()等常見函 
數還有兩個比較容易混淆的兩個函式resize()和reserver(),兩個函式最本質的區別就是前者 

6

最後就是關於賦值運算子的過載,並且還有一系列比較運算子的過載。

完整程式碼

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

void printvector(vector<int> v){
    vector<int>::iterator it=v.begin();
    for(it;it!=v.end();++it){
        cout<<*it<<" ";
    }
    cout<<endl;
}


int main(){
    //第一種:不傳引數
    vector<int> vint;
    vector<char> vchar;
    vector<string> vstring;

    //第二種:傳一個引數 相當於開闢了一個數組
    vector<int> vint2(5);
    vector<char> vchar2(5);
    vector<string> vstring2(5);

    //第三種:引數一 n個元素,每個元素的初值 開闢陣列並進行初始化
    vector<int> vint3(5,0);
    vector<char> vchar3(5,'a');
    vector<string> vstring3(5,"a");

    //第四種:傳一段迭代器區間
    vector<int> vint4(vint3.begin(),vint3.end());
    vector<char> vchar4(vchar3.begin(),vchar3.end());
    vector<string> vstring4(vstring3.begin(),vstring3.end());


    //第五種:傳一個物件,既拷貝函式
    vector<int> vint5(vint3);
    vector<char> vchar5(vchar3);
    vector<string> vstring5(vstring3);

    //第六種:賦值運算子的過載
    vector<int> vint6;
    vector<char> vchar6;
    vector<string> vstring6;
    vint6=vint5;
    vchar6=vchar5;
    vstring6=vstring5;

    //迭代器定義
    //begin() end() rbegin() rend() 正向和反向迭代器
    std::vector<int>::iterator itint=vint6.begin();
    std::vector<char>::iterator itchar=vchar6.begin();
    std::vector<string>::iterator itstring=vstring.end();
    itint =vint6.end();
    itchar = vchar.end();
    itstring=vstring.end();
    std::vector<int>::reverse_iterator ritint =vint6.rbegin();
    std::vector<char>::reverse_iterator ritchar = vchar.rbegin();
    std::vector<string>::reverse_iterator ritstring=vstring.rbegin();
    ritint = vint6.rend();
    ritchar = vchar6.rend();
    ritstring=vstring.rend();

    //cbegin() cend() crbegin() crend() const正向和反向迭代器
    std::vector<int>::const_iterator citint=vint6.cbegin();
    std::vector<char>::const_iterator citchar=vchar6.cbegin();
    std::vector<string>::const_iterator citstring=vstring6.cbegin();
    citint=vint6.cend();
    citchar=vchar6.cend();
    citstring=vstring.cend();

    std::vector<int>::const_reverse_iterator critint;
    std::vector<char>::const_reverse_iterator critchar;
    std::vector<string>::const_reverse_iterator critstring;
    critint=vint6.crbegin();
    critchar=vchar6.crbegin();
    critstring=vstring6.crbegin();
    critint=vint6.crend();
    critchar=vchar6.crend();
    critstring=vstring6.crend();

    //用來描述大小的一系列函式
    vector<int> test(5,1);
    cout<<test.size()<<endl;//表示順序表的元素個數
    cout<<test.capacity()<<endl;//表示順序表的容量
    cout<<test.max_size()<<endl;//表示容器的最大儲存,但實際到不了
    test.resize(1);//設定大小,可以開闢出更多的空間,當引數小於時就銷燬空間
    test.resize(10,2);//當大於時就開闢並初始化
    cout<<test.size()<<endl;
    test.empty();//用來檢查是否為空
    test.reserve(10);//用來設定容器大小但是並不初始化,元素個數也沒變,變化不可見
    test.shrink_to_fit();//將容器的大小收縮至於元素個數相同的大小

    //關於元素存取的函式
    //operator[] 既過載[]使其類似於陣列元素的操縱,實現隨機訪問
    cout<<test[1]<<endl;
    cout<<test.at(1)<<endl;//類似於[]的作用,只是是一個函式行形式
    cout<<test.front()<<endl;//顯示存在的第一個元素
    cout<<test.back()<<endl;//顯示存在的最後一個元素
    int* p = test.data();//取到了一個指向順序表的一個指標
    *p =10; 
    cout<<test.front()<<endl;//顯示存在的第一個元素

    //修改動作函式
    cout<<"==============================="<<endl;
    test.assign(vint6.begin(),vint6.end()-1);
    printvector(test);
    int arr[]={1,2,3};
    test.assign(arr,arr+3);//assign替換函式可以替換一個物件的區間或者一個同類型的陣列
    printvector(test);
    test.push_back(4);//尾插,並沒有頭插
    printvector(test);
    test.pop_back();//尾刪
    printvector(test);
    vector<int>::iterator it = test.begin();
    it++;
    test.insert(it,5);//插入指定位置
    printvector(test);
    test.erase(it);//刪除指定位置
    printvector(test);
    vector<int> test1(5,200);
    cout<<"===============交換============"<<endl;
    printvector(test);
    printvector(test1);
    test.swap(test1);//交換函式,將兩個物件進行交換
    printvector(test);
    printvector(test1);
    cout<<"===============交換結束========"<<endl;
    cout<<"===============清空============"<<endl;
    printvector(test1);
    test.clear();//清空整個順序表
    printvector(test1);
    cout<<"===============清空結束========"<<endl;
    printvector(test);
    vector<int>::iterator it2=test.emplace(it,5);//類似於insert但是會返回新插入元素的迭代器
    printvector(test);
    test.emplace_back(10);//類似於尾插
    printvector(test);
    return 0;
}