国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C++ > 正文

瞎學筆記之數組,vector,string in C++

2019-11-06 08:10:57
字體:
來源:轉載
供稿:網友

前言:初學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,必須包含<vector> 頭文件,且定義于命名空間std中 vector能容納絕大多數類型的對象為元素(不包括不是對象的引用),同時作為一個對象,vector同樣能作為對象被容納。

定義和初始化

vector<int> v1; //默認初始化vector<int> v2(v1); //v2包含v1元素的副本vector<int> v3 = v1;vector<int> v4(n, val)//包含n個重復的valvector<int> v5(n)//包含n個默認初始化的元素vector<int> v6{1, 2, 3};//列表初始化vector<int> v7 = {1, 2, 3};

以上為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中的元素,且只能訪問已存在的元素

數組與vector

C++不允許用vector為數組賦初值,但卻允許用數組為vector賦初值,只需指明首元素地址和尾后地址即可

int arr[] = {1, 2, 3}vector<int> ivec(begin(arr), end(arr));

string

標準庫類型string表示可變長的字符序列,與vector類似,擁有自己的頭文件<string> 且定義于命名空間std中

定義初始化

string s1;string s2(s1);string s3 = s1;string s4("value");//直接初始化string s5 = "value";//拷貝初始化string s6(n, 'c');

與vector類似的定義初始化方法,這里不做注釋

運算

os << s //將s寫到輸出流os中,返回osis >> s //從is中讀取字符串賦給s,以空白分隔,返回isgetline(is, s) //從is中讀取一行賦給s,返回iss.empty() s.size() //返回字符個數s[n] //返回第n個字符的引用s1 + s2 //返回s1和s2連接后的結果s1 = s2 s1 == s2 //對大小寫敏感的相等性判斷s1 != s2 s1 > s2 //字典順序比較,另有>,>=,<

當從輸入流中讀寫s時,會自動忽略開頭的空白,而在下一處空白時結束,而若要讀取空白,可以使用getline() 讀取一整行 與vector類似,s.size() 返回string中定義的類型size_type 相加時,只需保證+兩邊至少有一個string類型即可,值得一提的是,字符串字面值并不屬于string

處理字符

<cctype> 頭文件中包含了一組標準庫函數處理字符(對應C中的<ctype.h> 頭文件),此處不列出 在處理每個字符時,同樣可以使用范圍for語句進行遍歷 而使用下標訪問時,必須注意索引范圍在區間[0,s.size() - 1]

C風格字符串與string

C++支持C風格字符串,<cstring><string.h> 的C++語言版本 C++允許使用以空字符結束的字符數組初始化string對象或為其賦值,而如果要把string類型的對象賦給C字符串,則需要使用string成員函數c_str(),返回指向空字符結束的字符數組的指針,內容與string一樣,且類型為const char* 但實際使用過程中,string無疑更方便


迭代器

迭代器是一種比下標訪問更通用的機制,所有標準庫容器都支持迭代器

使用迭代器

有迭代器的類型同時擁有返回迭代器的成員,比如begin()end(),分別返回指向首元素的迭代器和尾后迭代器 迭代器支持運算,如

*iter //返回所指元素的引用iter -> mem //解引用iter并獲取mem成員,相當于 (*iter).mem++iter--iteriter1 == iter2iter1 != iter2

因為end()返回的迭代器不指示某個元素,所以不能遞增和解引用

迭代器類型

標準庫類型使用iteratorconst_iterator表示迭代器的類型,可以使用autodecltype忽略類型地聲明一個迭代器 begin()end()返回類型由對象決定是否為常量,C++11引入了cbegin()cend()兩種必然返回const_iterator 的函數

運算

迭代器同樣可以使用+,-,+=,-=等運算符,也可以相互根據指向位置前后進行比較,相減則就可以得到兩個同一容器迭代器之間的距離,距離返回difference_type 類型的帶符號整數

其他

注意,當容器容量改變時,原有迭代器都會失效,如向vector中添加元素。 個人認為,若容器支持下標運算,則下標運算會更方便,但迭代器無疑更普遍,深入學習后或許便能發現其比下標更優的地方


以上,便是本人這學期初的瞎學成果,課上還學習了class,此處不作詳細記錄。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 阿尔山市| 云和县| 渭南市| 邵东县| 泸定县| 武穴市| 龙井市| 张家港市| 彰化市| 临猗县| 嘉荫县| 邵阳县| 修水县| 小金县| 思茅市| 鹤山市| 安阳县| 宝清县| 辛集市| 林周县| 廉江市| 陇南市| 嘉禾县| 喀喇沁旗| 泽库县| 涡阳县| 玛多县| 隆昌县| 曲阳县| 吉安市| 丹阳市| 怀集县| 井冈山市| 沙湾县| 离岛区| 张掖市| 淅川县| 白河县| 砀山县| 江门市| 梓潼县|