C primer(第3章) 閱讀筆記

2021-09-27 01:16:49 字數 3427 閱讀 7243

範圍for語句是對給定序列中的每個元素並對序列中的每個值進行某種操作,其語法形式為:

string str

("some string");

// 輸出str中的每個字元

for(

auto c : str)

標準庫型別vector表示物件的集合,其中所有物件的型別都相同。vector容納中其他物件,因此這也被稱為容器(container)。要使用vector,需要新增適當的標頭檔案

#include

using std::vector ;

vector<

int> ivec ;

// 定義int型別的ivec

vecor sales_vec ;

// 儲存sales_item型別的物件

這裡,vector《變數型別》含義為:vector本質上是乙個類模板,編譯器在建立類的過程會對其進行例項化(instantiation),當使用這個模板時,需要指出要把類轉化為何種型別。換句話說:vector並不是乙個資料型別,而是乙個模板,因此需要指出vector中元素的型別,例如vector < int >。

下面給出定義與初始化vector物件的樣例

vector v1 ;

//t代表實際使用的類或者變數型別

vector

v2(n,val)

;//包含n個重複的元素,每個元素的值都是val

vector v3

;//包含了初始值個數的元素,每個元素被賦相應的值

vector v4 =

;//等價於v3

注:不能使用下標的形式來新增元素,但是可以通過下標進行元素訪問,看下面的例子

vector<

int> ivec;

// ivec[0] = 1; 錯誤,ivec不包含任何元素,還是乙個空的vector

ivec.

push_back(1

);cout << ivec[0]

<< endl;

//當這個元素存在的時候,也是可以通過下標來進行值更改的

ivec[0]

=2;cout << ivec[0]

<< endl;

要訪問string物件或者vector物件的字元,除了使用下標進行訪問之外,還可以使用迭代器

在所有的標準庫的容器中,都可以使用迭代器,但是其中只有少數幾種才同時支援下標運算子。嚴格而言,string物件並不是容器型別,但是string支援很多容器類似的操作。

和指標不一樣的是,獲取迭代器不是取締支付,有迭代器的型別會返回迭代器的成員。這些型別都擁有begin和end的成員,其中begin成員負責返回指向的第乙個元素。有如下語句:

auto b = v.

begin()

;//b表示第乙個元素

e = v.

end();

//e為尾元素的下乙個位置

若容器為空,那麼begin和end會返回同乙個迭代器,都是尾後迭代器。

迭代器運算子

迭代器中市場使用 == 和 !=來進行判斷

for

(auto it = s.

begin()

; it != s.

end()&&

!isspace

(*it)

;++it)

泛型程式設計的概念:我們在for迴圈中時常使用的是<=判斷結束條件,而迭代器更喜歡使用==和!=。

迭代器型別

vector<

int>

::iterator it ;

//it能讀寫vector中的元素

vector<

int>

::const_iterator it2 ;

//it2只能讀元素,不能寫元素

解引用可以獲得迭代器所指向的物件,如果該物件的型別恰好是類,那麼久可能希望進一步訪問他的成員。

例子:乙個由字串組成的vector物件,要檢查其元素是否為空,則:

(

*it)

.empty()

*it.

empty()

;//錯位,試圖訪問it的empty成員,但是it是乙個迭代器,沒有這個成員

以上,圓括號必不可少,具體含義為先解引用,再對解引用的結果進行點運算。

c++中,為了簡化上述操作,定義了箭頭運算子** (->)**。即it->men與(*it).mem表達的意思相同。

某些vector物件的操作會使迭代器實效

雖然vector可以動態的增長,但是有時也會有一些***。已知的乙個限制是不能在for迴圈內向vector新增元素。另外,一種是可能改變vector物件容量的操作例如push_back,都會使該vector物件的迭代器實效。

string nums=

;string *p = $nums[0]

;//p指向nums的第乙個元素

string *p2 = nums;

//陣列的乙個特性是,在一些用到陣列名字的地方,編譯器會自動將其替換成乙個指向資料首元素的指標

int ia=

;auto

ia2(ia)

;// ia是乙個整型指標,指向ia的第乙個元素

ia2 =42;

//錯誤,這是乙個指標

指標也是迭代器

就像使用迭代器遍歷vector物件中元素一樣,使用指標也遍歷陣列中的元素。

通過陣列名或者首元素的位址就可以得到指向首元素的指標,不過,要獲取尾後指標就需要使用陣列的乙個特殊性質:獲取尾元素後面那個不存在的元素的位址

例如,乙個陣列有10個元素

那麼

int

*e =

&arr[10]

;//指向arr元素的下乙個位置的指標

for(

int*b = arr; b != e;

++b)

注:尾後指標不能執行解引用和遞增操作。

下標和指標

int ia=

;int

*p = ia ;

a =*

(p+2);

//等價於a = ia[2]

int*p2 =

&is[2]

;//指向索引為2的元素

int k = p[-2

];//指向ia[0]的元素

C Primer 閱讀筆記(1 2章)

1 用istream物件作為條件時,其效果是檢驗流的狀態。如果流是有效的,即未遇到未知錯誤,那麼檢測成功。當遇到檔案結束符,或遇到乙個無效輸入時,istream的物件將會變成無效,處於無效狀態的istream物件會使條件變為假。2 cerr 乙個ostream物件,寫入cerr的資料是不緩衝的,通常...

C primer第二次閱讀學習筆記(第3章)

第三章 在標頭檔案中應該使用完全限定的標準庫名字,如std cout 而不應該使用 using std cout 或using namespaces std 在標頭檔案中放置 using 宣告,就相當於在包含該標頭檔案的每個程式中都放置了同一 using 宣告。應該在標頭檔案中包含確實需要的東西,遵...

C primer習題 第3章

習題 2.11 編寫程式,要求使用者輸入兩個數 底數 base 和指數 exponent 輸出底數的指數次方的結果。include include include using namespace std intmain for int i 1 i exp i result base cout 的 次...