有關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的迭代器就是指到最後一個元素的後面

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

在這裏插入圖片描述

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

最後望各位能發現我得錯誤,指出我得錯誤,謝謝各位
★,°:.☆( ̄▽ ̄)/$:.°★
撒個花

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