vector的資料安排以及操作方式,與array非常相似,兩者的唯一差別在於空間的運用的靈活性。array是靜態空間,一旦配置了就不能改變,要換大一點或者小一點的空間,可以,一切瑣碎得由自己來,首先配置一塊新的空間,然後將舊空間的資料搬往新空間,再釋放原來的空間。vector是動態空間,隨著元素的加入,它的內部機制會自動擴充空間以容納新元素。因此vector的運用對於記憶體的合理利用與運用的靈活性有很大的幫助,我們再也不必害怕空間不足而一開始就要求乙個大塊頭的array了。
vector的實現技術,關鍵在於其對大小的控制以及重新配置時的資料移動效率,一旦vector舊空間滿了,如果客戶每新增乙個元素,vector內部只是擴充乙個元素的空間,實為不智,因為所謂的擴充空間(不論多大),一如剛所說,是」配置新空間-資料移動-釋放舊空間」的大工程,時間成本很高,應該加入某種未雨綢繆的考慮,稍後我們便可以看到vector的空間配置策略。
vector維護乙個線性空間,所以不論元素的型別如何,普通指標都可以作為vector的迭代器,因為vector迭代器所需要的操作行為,如operaroe*, operator->, operator++, operator--, operator+, operator-, operator+=, operator-=, 普通指標天生具備。vector支援隨機訪問,而普通指標正有著這樣的能力。所以vector提供的是隨機訪問迭代器(random access iterators).
vector所採用的資料結構非常簡單,線性連續空間,它以兩個迭代器_myfirst和_mylast分別指向配置得來的連續空間中目前已被使用的範圍,並以迭代器_myend指向整塊連續記憶體空間的尾端。
為了降低空間配置時的速度成本,vector實際配置的大小可能比客戶端需求大一些,以備將來可能的擴充,這邊是容量的概念。換句話說,乙個vector的容量永遠大於或等於其大小,一旦容量等於大小,便是滿載,下次再有新增元素,整個vector容器就得另覓居所。
注意:
所謂動態增加大小,並不是在原空間之後續接新空間(因為無法保證原空間之後尚有可配置的空間),而是一塊更大的記憶體空間,然後將原資料拷貝新空間,並釋放原空間。因此,對vector的任何操作,一旦引起空 間的重新配置,指向原vector的所有迭代器就都失效了。這是程式設計師容易犯的乙個錯誤,務必小心。
vector建構函式
vector
v; //採用模板實現類實現,預設建構函式
vector(v.begin(), v.end());//將v[begin(), end())區間中的元素拷貝給本身。
vector(n, elem);//建構函式將n個elem拷貝給本身。
vector(const vector &vec);//拷貝建構函式。
//例子 使用第二個建構函式 我們可以...
int arr = ;
vector
v1(arr, arr +sizeof(arr) /sizeof(int));
vector常用賦值操作
assign(beg, end);//將[beg, end)區間中的資料拷貝賦值給本身。
assign(n, elem);//將n個elem拷貝賦值給本身。
vector& operator=(const vector &vec);//過載等號操作符
swap(vec);// 將vec與本身的元素互換。
vector大小操作
size();//返回容器中元素的個數
empty();//判斷容器是否為空
resize(int num);//重新指定容器的長度為num,若容器變長,則以預設值填充新位置。如果容器變短,則末尾超出容器長度的元素被刪除。
resize(int num, elem);//重新指定容器的長度為num,若容器變長,則以elem值填充新位置。如果容器變短,則末尾超出容器長》度的元素被刪除。
capacity();//容器的容量
reserve(int len);//容器預留len個元素長度,預留位置不初始化,元素不可訪問。
vector資料訪問操作
at(int idx); //返回索引idx所指的資料,如果idx越界,丟擲out_of_range異常。
operator;//返回索引idx所指的資料,越界時,執行直接報錯
front();//返回容器中第乙個資料元素
back();//返回容器中最後乙個資料元素
vector插入和刪除操作
insert(const_iterator pos, int count,ele);//迭代器指向位置pos插入count個元素ele.
push_back(ele); //尾部插入元素ele
pop_back();//刪除最後乙個元素
erase(const_iterator start, const_iterator end);//刪除迭代器從start到end之間的元素
erase(const_iterator pos);//刪除迭代器指向的元素
clear();//刪除容器中所有元素 巧用
swap
,收縮記憶體空間
#define _crt_secure_no_warnings
#include
#include
using
namespacestd;
int main()
cout<<"capacity:"<<v.capacity()
<<endl;
cout<<"size:"<<v.size()
<<endl;
//此時 通過resize改變容器大小
v.resize(10);
cout<<"capacity:"<<v.capacity()
<<endl;
cout<<"size:"<<v.size()
<<endl;
//容量沒有改變
vector<int>(v).swap(v);
cout<<"capacity:"<<v.capacity()
<<endl;
cout<<"size:"<<v.size()
<<endl;
system("pause");
returnexit_success;
}
reserve預留空間
#define _crt_secure_no_warnings
#include
#include
using
namespacestd;
int main()
}
cout<<"count:"<<count<<endl;
system("pause");
returnexit_success;
}
STL stack要點及使用
stack是一種先進後出 first in last out,filo 的資料結構,它只有乙個出口,形式如圖所示。stack容器允許新增元素,移除元素,取得棧頂元素,但是除了最頂端外,沒有任何其他方法可以訪問stack的其他元素。換言之,stack不允許有遍歷行為。有元素推入棧的操作稱為 push,...
STL queue要點及使用
queue是一種先進先出 first in first out,fifo 的資料結構,它有兩個出口,queue容器允許從一端新增元素,從另一端移除元素。queue所有元素的進出都必須符合 先進先出 的條件,只有queue的頂端元素,才有機會被外界取用。queue不提供遍歷功能,也不提供迭代器。que...
STL vector簡單使用
參考 需要標頭檔案 include include using namespace std 尾部新增元素push back vector int vec insert value for int i 0 i 5 i vec.push back 10 i 1 輸出元素 直接當初陣列進行輸出 vecto...