前言:初學C++,就覺得C略顯原始,最近看《C++ PRimer》了解了一點類型,在這里做個筆記
數組vector定義和初始化運算數組與vectorstring定義初始化運算處理字符C風格字符串與string迭代器使用迭代器迭代器類型運算其他
C++中的數組與C中的數組區別不大,數組名字代表了首元素的地址,聲明一個數組的維度使用常量表達式:int array[10];
也可以int array[] = {1, 2, 3};
若是沒有顯示初始化,則會被初始化為默認值。 訪問的時候有兩種方式:int a = array[1];
,也可以int a = *(array + 1);
這與C中是一樣的,無需多言。 C++11中引入了兩個函數begin()
和end()
,定義于<iterator>
頭文件中,以數組名為參數時分別返回該數組的首元素指針和尾元素下一個位置的指針,通過這兩個指針我們便可以通過for
遍歷每個元素,當然,也可以使用for (auto &i : array)
遍歷。 值得一提的是,數組作為對象也存在引用與指針,如:int (*arr1)[10] = &array;
和int (&arr2)[10] = array;
分別代表指向array的指針和對array的引用。 由于數組的大小固定,所以比之vector靈活性更差,而數組類型的C字符串也不如string方便。至于多維數組,其性質與C中并無明顯差別,也就不提。
標準庫類型vector表示對象的集合,與數組相似,但不限長度,被稱為容器,是一個類模板,而要使用vector,必須包含<vector>
頭文件,且定義于命名空間std中 vector能容納絕大多數類型的對象為元素(不包括不是對象的引用),同時作為一個對象,vector同樣能作為對象被容納。
以上為vector的初始化方法,不同于數組,vector可以使用=
直接將一個同類型的vector賦值給另一個
vector支持不同的操作,在此列出部分:
v.empty() //若v為空返回真v.size() //返回元素個數v.push_back(t) //向尾段添加一個值為t的元素 //而不能通過下標直接添加v[n] //返回第n個元素的引用v1 = v2v1 = {a, b, c}v1 == v2 //v1和v2相等當且僅當元素數量相同且 //對應位置元素相同v1 != v2v1 < v2 //以字典順序進行比較,也有<=,>,>=三個函數為vector的成員函數,其中v.size()
返回由vector定義的size_type
類型 與數組相同,可以使用下標訪問vector中的元素,且只能訪問已存在的元素
C++不允許用vector為數組賦初值,但卻允許用數組為vector賦初值,只需指明首元素地址和尾后地址即可
int arr[] = {1, 2, 3}vector<int> ivec(begin(arr), end(arr));標準庫類型string表示可變長的字符序列,與vector類似,擁有自己的頭文件<string>
且定義于命名空間std中
與vector類似的定義初始化方法,這里不做注釋
當從輸入流中讀寫s時,會自動忽略開頭的空白,而在下一處空白時結束,而若要讀取空白,可以使用getline()
讀取一整行 與vector類似,s.size()
返回string中定義的類型size_type
相加時,只需保證+
兩邊至少有一個string類型即可,值得一提的是,字符串字面值并不屬于string
在<cctype>
頭文件中包含了一組標準庫函數處理字符(對應C中的<ctype.h>
頭文件),此處不列出 在處理每個字符時,同樣可以使用范圍for語句進行遍歷 而使用下標訪問時,必須注意索引范圍在區間[0,s.size() - 1]
C++支持C風格字符串,<cstring>
是<string.h>
的C++語言版本 C++允許使用以空字符結束的字符數組初始化string對象或為其賦值,而如果要把string類型的對象賦給C字符串,則需要使用string成員函數c_str()
,返回指向空字符結束的字符數組的指針,內容與string一樣,且類型為const char*
但實際使用過程中,string無疑更方便
迭代器是一種比下標訪問更通用的機制,所有標準庫容器都支持迭代器
有迭代器的類型同時擁有返回迭代器的成員,比如begin()
和end()
,分別返回指向首元素的迭代器和尾后迭代器 迭代器支持運算,如
因為end()
返回的迭代器不指示某個元素,所以不能遞增和解引用
標準庫類型使用iterator
和const_iterator
表示迭代器的類型,可以使用auto
和decltype
忽略類型地聲明一個迭代器 begin()
和end()
返回類型由對象決定是否為常量,C++11引入了cbegin()
和cend()
兩種必然返回const_iterator
的函數
迭代器同樣可以使用+
,-
,+=
,-=
等運算符,也可以相互根據指向位置前后進行比較,相減則就可以得到兩個同一容器迭代器之間的距離,距離返回difference_type
類型的帶符號整數
注意,當容器容量改變時,原有迭代器都會失效,如向vector中添加元素。 個人認為,若容器支持下標運算,則下標運算會更方便,但迭代器無疑更普遍,深入學習后或許便能發現其比下標更優的地方
以上,便是本人這學期初的瞎學成果,課上還學習了class
,此處不作詳細記錄。
新聞熱點
疑難解答
圖片精選