第一次寫部落格,心裡還有點小激動,希望各位大牛幫我看看我對于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
最後望各位能發現我得錯誤,指出我得錯誤,謝謝各位
★,°:.☆( ̄▽ ̄)/$:.°★ 。
撒個花