vector 初始化有多種方法,下面將這些方法詳細羅列
vector
v1; //定義了乙個空vector,潛在元素是t型別,執行預設初始化
vector
v2(v1); //v2是v1的拷貝
vector
v2 = v1; //同上
vector
v3(n,val); //v3包含n個重複的元素,每個的值都是val
vector
v4(n); //v4包含n個重複的元素,每個的值都是預設初始化的(通常是0)
vector
v5; //v5包含參數列中的元素
vector
v5=; //同上
//example
int *ptrs[10]; //ptrs是乙個陣列,含有10個int型別指標
int &refs[10] = /*?*/; //refs是乙個陣列,但不存在引用的陣列,因此此定義錯誤
int (*parray)[10] = &arr; //parray是乙個指標,指向乙個含有10個int的陣列
int (&arrref)[10] = arr; //arrref是乙個引用,引用自乙個含有10個int的陣列
讀懂複雜陣列宣告的方法兩點原則:(這跟讀懂頂層、底層const很相似)
1.定性複雜的宣告中常有* & 也就是指標,引用,陣列這三重修飾詞修飾變數名,找出變數名的本質,也就是變數本質上是乙個指標,引用抑或是陣列. 為了做到這一點依賴於第二點:閱讀次序
2.閱讀次序有括號先讀括號內,無括號從右向左讀. 第乙個讀出的就是變數名的本質
//example
int *(&arry)[10] = ptrs;
//這是乙個複雜的定義,按照上面的原則先對其定性
//有括號先讀括號內,於是知道這是乙個引用
//下一步就是弄清楚這是對什麼的引用
//按照從右往左讀的原則,這是乙個對陣列的引用
//進一步完善,這是乙個對指標陣列的引用,指標型別是int*,陣列有10個元素
int ia =;
ia是陣列名,同時也有另一層含義,即ia是指向ia陣列第乙個元素的指標.
當用auto自動推斷型別時,返回是int* 而不是陣列
而使用關鍵字decltype返回的型別則是由10個整型組成的陣列(int[10])
auto
a_type(ia); //a_type的型別是 int*
decltype(ia) d_type; //d_type的型別是 int[10]
int ia = ;
int *beg = begin(ia); //beg是ia陣列頭指標
int *last = end(ia); //last是ia陣列尾後指標
using matrix = int[10][10];
matrix mt; //定義了乙個二維陣列
int i = 1;
for (auto &row : mt)
}
要使用範圍for語句處理多維陣列,除了最內層的迴圈外,其他所有迴圈的控制變數都應該是引用型別.如果不欽定為引用型別,寫成如下形式
//非指定引用
for(auto row : mt)
for(auto col : row)
row將會自動獲取為int*型別,程式無法通過編譯(這一點詳見上述 陣列與指標—陣列名—auto與decltype)
//指定引用
for(auto &row : mt)
for(auto col : row)
row自動獲取型別為int &[10],可以吧row看做是int[10][10]的下一級成員
而第二層迴圈中col可看做是row的再下一級成員,即int&[10]的下一級—–int型別
Chapter3 字串 向量和陣列
1 for declaration expression 2 statement vector和陣列都是物件的集合,而引用不是物件。vector物件可以高效地增長,在定義vector物件的時候設定其大小也就沒什麼必要了,事實上如果這麼做效能可能更差。為了便於專門得到const iterator型別的...
《程式設計實踐》chapter3字串
albert einstein alberteinstein albert einstein albert einstein albert einstein albert einstein a hello a 0 3 hel 操作符 表示式 abc def abcdef ab 2 abab ab 0...
Swift文件Chapter 3 字串和字元
swift的字串型別由string型別表示,也有多種訪問方式,例如以character集合方式訪問。字串的字面量是一對雙引號包裹著的具有固定順序的字符集。一對三個引號包裹著的字串是多行字串字面量。字串開始位置為三引號後一行 意味著第乙個換行符不會計入 結束位置是三引號前一行 意味著三引號前的換行符不...