C 學習筆記7 vector容器

2021-10-08 22:12:02 字數 4572 閱讀 9062

使用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...