再探C++Primer(6) 標準庫類型string、vector和迭代器

###string#git

使用string類需包含 string 頭文件(舊C風格庫中爲string.h),string定義於命名空間std中(舊風格不是)。數組

#include<string>
using std::string;

string的初始化方式:函數

string s1;					//默認初始化,s1爲空
string s2(s1);				//拷貝初始化,s2爲s1的副本
string s3("hello");			//傳參初始化,s3爲"hello"串,不包含最後的'\0'
string s3 = "hello";		//等價於s3("hello"),實現方式不一樣
string s4(n,'c');			//把s4賦值爲連續n個字符'c'組成的字符串

對string對象的操做:spa

os << s						
is >> s						//輸入輸出流
getline(is, s)				//從is中讀取一行給s
s.empty()					//判斷s是否爲空,爲空返回true
s.size()					//返回s中字符個數
s[n]						//訪問s中第n個字符
s1 + s2						//返回s1和s2鏈接後的結果,每一個+兩側必須有一個string對象
s1 = s2						//用s2的副本替代s1
s1 == s2					//若s1和s2中全部字符所有同樣,則爲true
s1 != s2					
<, <=, >, >=				//利用字典序對字符進行比較,且對大小寫敏感

同char數組不一樣的是,string在C++11之前的標準中並無規定必須以'\0'結尾,因此不一樣的編譯器有不一樣的實現規則,而C++11已經規定必須以'\0'結尾了。指針

處理string對象中的字符:cctype頭文件中定義了一組標準庫函數處理字符code

isalnum(c)					//當c爲字母或數字爲真
isalpha(c)					//當c爲字母時爲真
iscntrl(c)					//當c爲控制字符爲真
isdigit(c)					//當c爲數字爲真
isgraph(c)					//當c不爲空格但可打印時爲真
islower(c)					//當c是小寫字母爲真
isprint(c)					//當c是可打印字符爲真
ispunct(c)					//當c是標點符號時爲真
isspace(c)					//當c是空白(空格,製表符..)時爲真
isupper(c)					//當c是大寫字母爲真
isxdigit(c)					//當c是16進制數字爲真
tolower(c)					//若是c爲大寫則轉變爲小寫輸出,不然原樣輸出
toupper(c)					//若是c爲小寫則轉變爲大寫輸出,不然原樣輸出

###vector#對象

vector又被稱爲容器,表示對象的集合,vector屬於一種類模版,模板自己並非類或者對象,編譯器根據模板來建立類或者函數,稱爲實例化。vector定義於vector頭文件和std命名空間。索引

#include<vector>
using std::vector;

經過提供信息來指明容器實例化爲何樣的類:字符串

vector<int> a;				//a保存int類型的對象
vector<S>	b;				//b保存S類型的對象
vector<vector<string>>	c;	//c保存vector<string>類型的對象

過去vector的嵌套須要在內層和外曾的'>'之間加一個空格,C++11不須要了。get

vector的初始化:

vector<T>	a				//a爲空vector,其潛在元素是T類型的,默認初始化
vector<T>	b(a)			//b中包含a中全部元素的副本
vector<T>	b = a			//同上
vector<T>	c(n,v)			//c中包含了n個元素,每一個元素都是v
vector<T>	d(n)			//d中包含了n個執行了默認初始化的T對象
vector<T>	e{x,y,z...}		//e中包含了初始值個數的元素,每一個元素都被賦初值
vector<T>	f={x,y,z...}	//f同e

vector操做索引:

v.empty()					//若是v爲空則爲真
v.size()					//返回v中元素個數
v.push_back(t)				//將t加入隊尾
v[n]						//返回v中第n個位置上的元素
v1 = v2						//用v2中元素的拷貝替換v1的元素
v1 = {x,y,z...}				//用列表中元素拷貝替換v1的元素
v1 == v2 					//v1同v2元素數量相同且元素對應位置相同
v1 != v2
<, <=, >, >=				//當v一、v2中元素可比時,字典序比較

vector的實現方式爲動態數組,因此其隨機訪問的時間複雜度爲O(1),隊尾push和pop的時間複雜度爲O(1),不支持隨機添加修改刪除,本身寫的話時間複雜度爲O(n)。

vector和string同樣,其size()返回的並非int而是一個size_type類型的值,是一個無符號整型。

###迭代器#

迭代器是string和容器的輔助標準庫類,實現了對string和容器的訪問。迭代器同指針同樣,有效迭代器指向某個元素或容器中尾元素的下一個位置,其餘狀況都屬於無效。

有迭代器的類型經過begin()方法返回第一個元素,end()方法返回尾元素的下一個位置。

auto b = v.begin();			//begin返回v的第一個元素
auto c = v.end();			//end返回v的最後一個元素的下一個位置

若是v爲空,則begin和end都返回v的尾後位置。

迭代器運算符:

*iter						//返回迭代器iter所指元素
iter->mem					//等同於(*iter).mem
++iter						//令iter指向容器的下一個元素
--iter						//令iter指向容器的上一個元素
iter1 == iter2				//若是兩個迭代器指向同一元素或爲同一尾後迭代器,則相等
iter1 != iter2

string和vector迭代器提供了更多的運算符:

iter + n 
iter - n
iter += n
iter -= n
iter1 - iter2				//計算兩個迭代器之間的距離
							//參與比較的兩個迭代器必須指向同一容器中元素或尾元素下一位置
>, >=, <, <=                //比較操做比較迭代器在容器中的位置,順序爲升序
							//參與比較的兩個迭代器必須指向同一容器中元素或尾元素下一位置
相關文章
相關標籤/搜索