範圍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 的 次...