使用vector必須加上標頭檔案
#include
vector表示乙個型別相同的物件的集合,如:
vector <
int> i;
vector s;
vector 《類名》 d;
c++中既有類模板,也有函式模板,模板本身不是乙個類或者函式,更像是乙份說明,編譯器根據模板建立乙個類或者模板的過程稱為例項化。vector是乙個類模板。對於類模板需要提供額外的資訊指定模板到底生成什麼樣的類,例項化提供的資訊:模板名後跟一對尖括號,括號內即為資訊。
vector可以包含的內容,除了引用型別,大部分都可。
針對vector的物件型別是vector,
vectorint>
>
//有空格,老式寫法
vectorint>>
//無空格,c++11寫法
定義和初始化:
最常見的方式是定義乙個空的vector,執行時再根據需要新增。v1。
vector v1;
vector
v2(v1)
;vector v2=v1;
vector
v3(n,val)
//n個重複的元素,元素值為val;
vector
v4(n)
;//n個;
vector v5
;//區分列表初始化
vector v5=;//
vector v6
;//列表初始化
區分列表初始值還是元素:
vector<
int>v1(
10);//10個元素,每個初始化為0
vector<
int> v2
;//1個元素,為10
vector<
int>v3(
10,1)
;//10個元素,每個值為1
vector<
int> v4
;//2個元素,值為10,1
vector s1
;//列表初始化
vectors2(
"hi");
//錯誤,不能使用字串字面值構建vector物件
vector s3
;//10個元素,每個都是預設初始化的值
vector s4
;//10個值,每個值為hi
向vector中新增物件:
直接初始化不常用,更常用的是定義時為空,要用時往裡新增值;
使用函式push_back()。如:
vector<
int> i;
for(i=
0;i<
100;
++i)
i.push_back
(i);
//string s;
vector v;
while
(cin>>s)
v.push_back
(s);
如在迴圈體內部包含有向vector新增元素的語句,如上的while迴圈,則不能使用範圍for
vector的一些函式:v.size()、v.empty()、v.push_back()、v[n](返回v中第n個位置上的引用。
訪問vector中的元素:與string類似
vector<
int> v
;for
(auto
&i:v)
//範圍for迴圈,改變值,則用引用
i*=i;
for(
auto i:v)
//範圍for迴圈,只輸出,
cout<" ";
cout
decltype
(v.size()
) i=
0;isize()
;++i)
cout<<<
"_";
cout<注意:絕對不能通過下標形式來新增vector元素。
string物件也不能通過下標形式進行新增元素,可能用於訪問。
溢位現象:
只能對 確知已存在的元素執行下標操作。
vector<
int> v;
cout<;/錯誤,v沒有初始化,並不知道有沒有值,不能通過下標訪問
vector<
int>v1(
10);cout<;//錯誤,v的合法範圍是0-9,
迭代器
1)迭代器提供了對物件的間接訪問
2)所有的容器包括vector都有迭代器,但是只有vector既支援迭代器,也可以使用下表運算。string不是容器,但也支援迭代器和下標。
3)有迭代器的型別同時擁有返回迭代器的成員,比如,begin 和 end成員。
4)begin返回指向第乙個元素的迭代器,end返回指向最後乙個元素下乙個位置的迭代器。如果容器為空,則begin 和 end 返回的是同一位置,可通過此來判斷容器是否為空。
迭代器的運算:
1)*iter 解引用,來獲取該迭代器指示的元素。注:執行解引用的迭代器必須合法並確實指向某一元素。解引非法的迭代器和尾後迭代器是未定義的行為。
2)++iter/–iter 自加自減,令iter指示容器中的下乙個/上乙個元素。
3)== != 判斷相等或者不等
4)iter+n/iter-n n為整數,加減乙個整數結果仍未乙個迭代器,指向的位置變了n
5)iter-iter1 兩個迭代器相減的結果是他們的距離,結果的型別是difference_type帶符號整數型,參與運算的迭代器必須是指向同一容器的元素
string s
("some string");
if(s.
begin()
!=s.
end())
//確保s非空
auto it =s.
begin()
;//it是指向第乙個元素的迭代器。
*it =
toupper
(*it)
;//通過操作解引的迭代器讓第乙個元素變為大寫形式
迭代器的型別
iterator 和 const_iterator
vector <
int>
::iterator it;
//it能讀寫vextor中的元素
vector <
int>
::const_iterator it1;
//it1只能讀,不能寫
begin()和end()運算子返回的型別:由物件是否是常量決定
1)如果物件是常量,則返回const_iterator,如果不是常量則返回iterator
2)c++11新引進的cbegin() 和cend()新函式,方便返回const_iterator
vector <
int> v1;
const vector <
int> v2;
auto it1 = v1.
begin()
;//it1的型別是iterator
auto it2 = v2.
begin()
;//it2的型別是const_iterator
簡單的運用
1)如檢查乙個字串組成的容器是否為空
vector v1;
//此時定義的是空的,但這裡只是示意有這麼乙個容器。
it = v1.
begin()
;//此時的it是指向第乙個元素的迭代器,但也只是示意其是v1的迭代器
(*it)
.enpty()
;//通過解引,呼叫結果物件的empty成員。
為簡化使用箭頭運算子-> ,即it->empty()與(*it).empty()一樣
迭代器失效:
1)不能在範圍for迴圈中向vector物件中新增物件,
2)任何一種改變容器 容量的操作,如新增元素.push_back(),會使該物件的迭代器失效
二分法在有序列中使用的方法
auto beg = text.
begin()
;auto end = text.
end();
auto mid = text.
begin()
+(end-beg)/2
;while
(mid!=end && mid!= sought)
//當還有元素未被檢查且還沒有找到目標值sought時if(
*mid>sought)
end = mid;
else
beg = mid+1;
mid = beg +
(end-beg)/2
;//重置一下mid
ACM學習歷程7 Vector向量容量擴充套件機制
vector向量容器相當於乙個動態的陣列,當向向量容器中不斷加入元素,若超過容器本身的大小限制,vector 會自動拓展大小,在這過程中涉及到記憶體的分配和 在vector 中有size 和capacity 函式,與之相對應的兩個函式 resize size type 和reserve size t...
C 中的vector容器物件學習筆記
c 中陣列很坑,有沒有類似python中list的資料型別呢?類似的就是vector!vector 是同一種型別的物件的集合 每個物件都有乙個對應的整數索引值。和 string 物件一樣,標準庫將負責管理與儲存元素相關的記憶體。我們把 vector 稱為容器,是因為它可以包含其他物件 乙個容器中的所...
C 學習(19) vector容器
功能 vector與普通陣列區別 動態擴充套件 功能描述 函式原型 include includeusing namespace std void printvector vectorv cout endl void test01 printvector v1 通過區間方式進行構造 vectorv2...