vector是同一種型別的物件的集合,每個物件都有乙個對應的整數索引值。vector成為容器,因為它能包含其他物件,所有物件必須是同一種型別。
#include
using std::vector;
注意:vector是一種類模板,不是一種資料型別,它可以來定義任意多種資料型別。如vector和vector都是資料型別。
1.vector物件的定義和初始化
(1)vectorv1; vector儲存型別為t的物件。預設建構函式v1為空。
(2)vectorv2(v1); v2是v1的乙個副本
(3)vectorv3(n,i); v3包含n個值為i的元素。
(4)vectorv4(n); v4含有值初始化的元素的n個副本。
重點:vector物件動態增長
vector物件(以及其他標準容器物件)的重要屬性就在於可以在執行時高效地新增元素。因為vector增長的效率高,在元素已知的情況下,最好是動態地新增元素。
2.值初始化
如果沒有指定元素的初始化式,那麼標準庫將自行提供乙個元素初始值進行值初始化。
如:vectorfvec(10);//10個元素都初始化為0
vectorsvec(10); //10個元素都是空字串
3.vector物件的操作
(1)size
empty和size操作類似於string物件的相關操作。成員函式size返回相應vector類定義的size_type的值。
注意:使用size_type型別時,必須指出該型別是**定義的。vector型別總是包括vector的元素型別
vector::size_type//正確
vector::size_type //錯誤
(2)向vector新增元素
push_back()操作接受乙個元素值,並將它作為乙個新的元素新增到vector物件的後面,也就是「插入(push)」到vector物件的「後面(back)」:
string word;
vectortext;
while(cin>>word)
text.push_back(word);
(3)vector下標的操作
vector元素的位置從0開始。
string word;
vectortext;
while(cin>>word)
text.push_back(word);
for(vector::size_type ix=0; ix!=text.size(); ++ix)
text[ix] = "0";
for(vector::size_type ix=0;ix!=text.size();++ix)
cout《注意:上例,即使text為空,for迴圈也會正確執行。text為空則呼叫size返回0。
c++程式設計師習慣於習慣優先選用!=而不是《來編寫迴圈判斷條件。
4.下標操作不新增元素
注意:必須是已存在的元素才能用下標操作符進行索引。通過下標操作符進行賦值時,不會新增任何元素。
僅能夠對己存在的元素進行下標操作。
5.vector的迭代器
(1)標準庫為每一種標準容器定義了一種迭代器型別,如:vector::iterator iter;
需要注意的是iter是迭代器,
vector是迭代器型別。
(2)begin和end操作
每個容器都定義了一對命名為begin和end的函式,用於返回迭代器。
vector::iterator iter = ***.begin();假設***不為空,初始化後iter指向該元素的***[0]。
由end操作返回的迭代器指向vector的「末端元素的下乙個」。通常稱為超出末端迭代器,表明它指向了乙個不存在的元素。如果vector為空,begin返回的迭代器與end返回的迭代器相同。
由end操作返回的迭代器並不指向vector中任何實際的元素,相反,它只是起乙個哨兵的作用,表示我們已處理完vector中所有的元素
6.vector的迭代器的自增和解引用運算子(*操作符)
vector::iterator iter = ***.begin();
*iter = 0;// *iter和***[0]就是指向同乙個元素。
++iter指向第二個元素。
注意:由於end操作返回的迭代器不指向任何元素,因此不能對它進行解引用或自增操作。
vectorfvec(10,20);
//重置值,方法一
for(vector::size_type ix=0; ix!=fvec.size(); ++ix)
fvec[ix] = 10;
for(vector::size_type ix=0;ix!=fvec.size();++ix)
cout<::iterator iter=fvec.begin();iter!=fvec.end();++iter )
*iter = 15;
for(vector::size_type ix=0;ix!=fvec.size();++ix)
cout<7.const_iterator
每種容器型別定義了乙個名為const_iterator的型別,該型別只能用於讀取容器內元素,但不能改變其值。
vectorfvec(10,20);
for(vector::iterator iter=fvec.begin();iter!=fvec.end();++iter )
*iter = 15;
//方法1
for(vector::size_type ix=0;ix!=fvec.size();++ix)
cout<::const_iterator iter=fvec.begin();iter!=fvec.end();++iter)
cout<<*iter《注意:使用const_iterator型別時,我們可以得到乙個迭代器,它自身的值可以改變,但不能用來改變其所指向的元素的值。可以對迭代器進行自增以及使用解引用操作符來讀取值,但不能對改元素賦值。
const_iterator物件與const的iterator物件混肴起來,宣告乙個const迭代器時,必須初始化容器。一旦被初始化後,就不能改變它的值。
vectorfvec(10,20);
const vector::iterator cit = fvec.begin();
*cit = 1;//正確
++cit; //錯誤
const的iterator幾乎沒什麼作用。
8.迭代器的算術操作
注意:任何改變vector長度的操作都會使已存在的迭代失效,例如,在呼叫push_back之後,就不能再信賴指向vector的迭代器的值了。
標準模板庫 (向量 vector)
編寫程式練習了vector 的主要函式。從中學習到了一些知識點 1.vector的內部其實還是陣列。2.at用於按照索引訪問任意位置的元素,front用於訪問頭元素,back用於訪問尾元素。3.arr.at i 和arr i 是等價的,在vector的內部過載了操作符。4.push back用於在尾...
STL標準模板庫 vector
原 2019年02月09日 12 24 18 bbbbbinary 閱讀數 162 更多分類專欄 stl 筆記總結 vector可以看作陣列的增強版,可以用類似陣列的直接取得方式訪問,也可以使用函式操作,好處是可以不用提前規定長度,可以實現不定長度的儲存。需要的標頭檔案 include vector...
C 標準模板庫 vector
include vectorarryname vector int myarray vector myarray2 node 是結構體 vector double myarray3 vectorint array 兩維均可變長的變長二維陣列 之間一定要有空格 否則c11之前認為是向右可能報錯 vec...