天天看點

有關C++中STL中的vector的一些個人了解

第一次寫部落格,心裡還有點小激動,希望各位大牛幫我看看我對于vector的一些個人了解對不對,倘若有錯誤,請指出,在此特别感謝

首先先說一下我對于C++的vector的一些個人了解,我剛開始是學C的,是以前一陣的練習一些競賽題目的時候,習慣用數組模拟一切,但時間長了就會覺得很吃力,打算入C++的坑,是以對于vector的了解還是覺得它是一個可變的數組,并不了解為什麼要叫它向量,望有dalao能指點一下為什麼vector要叫向量。

好開始正題

正如前面所說,vector是一個可變數組,但它和數組又不一樣,vector有一些自己定義的函數,以及不同與數組的命名方式

定義一個名字為text元素為int的vector:vector text;

定義一個對應該vector的名字為p的疊代器:vector:: iterator p;

vector對應的函數

begin():無需傳入,傳回 一個 指向 vector的第一個元素所在地方的疊代器

end():無需傳入,傳回 一個 指向 vector的最後一個元素所在疊代器 的後一個 //注意是後一個,因為C++的STL的内部函數對一個區間的操作是左閉右開[ , ),是以對應的取end的疊代器就是指到最後一個元素的後面

在這裡上一個圖加深了解(這個圖是我從網上找來的,在此感謝提供者)

有關C++中STL中的vector的一些個人了解

push_back(元素):傳入一個元素,在vector後添加該傳入的元素,不用像數組那樣考慮vector得大小,但隻能以該類往vector中添加元素,因為該列是vector得自帶得類,是以可以了解為這個類自動往後申請空間然後添加元素;

pop_back():無需傳入,删除vector最後一個元素,徹底删除的那種,數組隻能覆寫而無法删除;

erase(iterator):傳入一個疊代器,然後删除該疊代器指向的元素;//text.erase(text[text.size()-1])等同于text.pop_back

insert(iterator,元素):傳入一個疊代器和一個元素,将 傳入的元素 插入 傳入的疊代器指向的地方 和 傳入的疊代器的上一個的地方 之間

size():傳回該可變數組得大小;

resize():改變可變數組得大小,倘若将vector當作數組來用,需在使用之前用該類改變大小;//一般如果習慣用數組經常需要用這個來改變vertor的長度

vector倘若當作數組用,[]裡面的數字必須小于該vector的size,如果大于等于的話會發生不可預料的事情,和數組一樣,超出我們對vector定義的空間了,但隻是超出我們定義的空間了;

下面上代碼

#include<iostream>
#include<vector>
#include<algorithm> 
using namespace std;
int main()
{
    vector<int> number;//定義一個名字為number的vector 
    int n;//接下來将要輸入n個數 
    cin>>n;
    while(n--)
    {
        int text;
        cin>>text;
        number.push_back(text);
        //用push_back往vector中添加 
    }
    /*注意如果想讓number當作數組來用的話,應該怎麼輸入
    number.resize(n);//這句是關鍵,必須初始化否則程式會運作不起來,可以删除這句話然後再運作一下試試 
    for(int i=0;i<n;i++)
        cin>>number[i];
    */ 
    
    vector<int>::iterator p;//定義一個名為p的疊代器  疊代器是一個類似于指針但比指針更智能化的東西,疊代器來源于指針,可以說疊代器是指針的兒子 
    for(p=number.begin();p!=number.end();p++)//這句話是使用疊代器通路vector中的每個元素的慣用語句 
        cout<<*p<<" ";
    cout<<endl; 
    //注意倘若number的size變化(該變化是因為resize||pop_back||push_back||erase||insert)則疊代器指向的地方将會變的混亂,建議重新指派 
    
    number.pop_back();//删除vector的最後一個元素 
    for(p=number.begin();p!=number.end();p++)
        cout<<*p<<" ";
    cout<<endl;
    
    sort(number.begin(),number.end());//在下邊需要用lower_bound函數,該函數使用前需排序 
    
    int x;
    cin>>x;
    p=lower_bound(number.begin(),number.end(),x);//該函數會傳回第一個大于等于x的元素的疊代器,倘若沒有則傳回number.end()
    if(p!=number.end()) number.erase(p);//删除該元素 
    for(p=number.begin();p!=number.end();p++)//周遊一遍看看删除了沒有 
        cout<<*p<<" ";
    cout<<endl;
    
    cin>>x;
    p=lower_bound(number.begin(),number.end(),x);//該函數會傳回第一個大于等于x的元素的疊代器,倘若沒有則傳回number.end()
    if(p!=number.end()) number.insert(p,x);//在該元素前插入x,其實就是在一個排好序的數組中插入一個元素,保持順序不表 
    for(p=number.begin();p!=number.end();p++)//周遊一遍看看插入了沒有 
        cout<<*p<<" ";
    cout<<endl;
    
    return 0;
}
           

想了解一下的人建議仔細讀讀代碼,注釋已經剛開始的解釋都挺詳細的

測試資料

10

1 6 2 3 5 8 9 7 4 0

5

5

樣例輸出

1 6 2 3 5 8 9 7 4 0

1 6 2 3 5 8 9 7 4

0 1 2 3 4 6 7 8 9

0 1 2 3 4 5 6 7 8 9

//第一行是用疊代器輸出vector中的所有元素

//第二行是用pop_back()删除了vector的最後一個元素

//第三行是輸入了5然後删除了5後輸出vector中的剩餘元素,使用了erase()

//第四行是輸入了5然後在排好序的vector中不亂序的插入了元素5

最後望各位能發現我得錯誤,指出我得錯誤,謝謝各位

★,°:.☆( ̄▽ ̄)/$:.°★ 。

撒個花

繼續閱讀