第三章 標準庫型別
1、標準庫string型別
string型別支援長度可變的字串,該型別的目的就是滿足對字串的一般應用。
string物件的初始化方式:
string s1;//預設方式,s1為空串
string s1(s2);//s1是s2的副本
string s1(「value」);//將s1初始化為乙個字串字面值的副本
string s1(n,'c');//將s1初始化為有n個字元c的字串
2、string物件的讀寫
程式有多種方法接受從鍵盤輸入的字串。
第一種,使用cin>>string:
比如下面的程式段:實現從標準輸入讀入一組字串,然後逐行輸出
int main()
return 0;
}使用cin>>stirng讀取字串的規則是:
a、忽略開頭所有的空白字元,比如空格、換行、製表符
b、讀取字元直到遇到空白字元,讀取終止
對於上面的程式,如果我們輸入:「 this is a test! 」
執行結果應該是:
thisisa
test!
可以說,cin>>string是使用空白符作為分隔符,把空白符之間的所有字元按照乙個字串來處理。所以使用這種方法不能輸入帶有空白符的字串。
第二種,使用getline()函式
這個函式接受兩個引數:乙個輸入流,乙個字串物件。getline函式從輸入流讀取一行,並儲存到string物件中,但不包括換行符。getline不忽略開頭的換行符,只要遇到換行符,即便是第乙個字元,getline也將停止讀入並返回。如果第乙個字元是換行符,則string引數將被置為空string。
下面的程式實現從標準輸入按行讀取字串:
int main()
return 0;
}其實getline函式有三個引數,最後乙個引數是行的結束符,預設是回車。遇到這個字元才表示一行結束了,才會輸出它前面的字串。
3、string操作
s.empty();//如果s為空,返回true,否則返回false
s.size();//返回s中字元的個數
s[n];//返回s中位置為n的字元,位置從0開始計數,返回值是乙個左值
s1 + s2;//返回s1和s2連線到一起的新的字串
s1 = s2;//把s1替換為s2
s1 == s2;//比較s1和s2是否相等
!=,<,<=,>,>=//字串比較
注意:string s = "aaa" + "bbb";這是非法的。+操作符的左右運算元至少要有乙個是string型別的。
string a = "aaa";
string s = a + "bbb";//這是正確的,因為a是乙個string型別的物件
4、標準庫vector型別
vector是同一種型別的物件的集合。我們把它叫做一種容器。
比如:vectorivec;//定義了乙個用於儲存多個int型別變數的容器
vectorsvec;// 定義了乙個用於儲存多個string型別物件的容器
乙個容器中儲存的物件必須是同一型別的。
vector物件的定義和初始化:
vectorv1; //v1為空
vectorv1(v2);//v1是v2的副本
vectorv1(n,i);//v1中包含n個值為i的元素
vectorv1(n)://v1含有type型別的預設值的n個副本
對於最後一種初始化形式,舉例如下:
vectorv1(10);//該語句會得到乙個有10個元素的vector,每個元素都是int型的預設值"0"
vectorv1(10);//該語句會得到乙個有10個元素的vector,每個元素都是string型的預設值"空字串"
就是說,對於每一種資料型別,標準庫都規定了乙個預設值,vectorv1(n)將會使用預設值去初始化vector,從而得到乙個含有10個元素(每個元素都是預設值)的vector
5、vector物件的操作
v.empty()//如果v為空,返回true
v.size()//返回v中元素的個數
v.push_back(t)//在v的末尾追加乙個元素
v[n]//下標操作,返回v中位置為n的元素,位置從零開始,返回值是乙個左值
v1 = v2//把v1中的元素替換為v2中元素的副本
v1 == v2//如果v1與v2相等,返回true
!=,<,<=,>,>=//判斷
注意:下標操作只能操作已存在的資料,所以下標操作不能向vector中新增元素,只能讀取和修改
6、迭代器
迭代器是一種檢測容器內元素並遍歷元素的資料型別。
標準庫為每一種標準容器(包括vector)定義了一種迭代器型別。迭代器型別提供了比下標操作更通用的方法:所有的標準庫容器都定義了相應的迭代器型別,而只有少數的容器支援下表操作。
vector::iterator iter;這條語句就定義了乙個vector::iterator型別的迭代器。
每種容器都定義了一對命名為begin和end的函式,用於返回乙個迭代器。
begin函式返回的迭代器指向第乙個元素,如果容器不為空的話。end函式返回容器「末端的下乙個」,通常成為「超出末端迭代器」。如果容器為空,begin和end返回的迭代器相同。
例:vector::iterator iter = ivec.begin();//返回的迭代器指向ivec的第乙個元素
迭代器的解引用和自增操作:
可以使用解引用操作符(*操作符)來訪問迭代器指向的元素:*iter = 0表示把迭代器當前指向的元素置為0
如果iter指向vector物件ivec的第乙個元素,那麼*iter和ivec[0]表示同乙個意思。
++iter就是自增操作,表示把容器中的迭代器「向前移動乙個位置」,如果iter指向第乙個元素,那麼自增之後就指向第而箇元素。
示例程式:把容器中的每個元素都置為1
vectorivec(10);
for(vecot::iterator iter = ivec.begin(); iter != ivec.end(); ++iter)
*iter = 1;
7、標準庫bitset型別
使用bitset可以處理二進位制位的有序集。//只能處理0和1
定義和初始化:
bitsetb;//b有n位,每位都是0
bitsetb(u);//b是unsigned long型u的乙個副本
bitsetb(s);//b是string物件s中含有的位串的副本
bitsetb(s,pos,n);//b是s中從位置pos開始的n個位的副本
注意:初始化時,使用上面的後面兩種種形式時,給b賦的值中只能包含0和1,不能包含其它字元,應為「使用bitset可以處理二進位制位的有序集」。
例:bitset<16> bitvec1(0xffff);
bitset<16> bitvec2("110001")//字串中只能包含0和1
bitset物件上的操作:
b.any() //b中是否存在置為1的二進位制位
b.none() //b中不存在置為1的二進位制位嗎
b.count() //b中置為1的二進位制位的個數
b.size() //b中二進位制位的個數
b[pos] //訪問b中pos處的二進位制位
b.test(pos) //b中在pos處的二進位制位是否位1
b.set() //把b中所有的二進位制位都置為1
b.set(pos) //把b中pos處的二進位制位置為1
b.reset() //把b中所有的二進位制位都置為0
b.reset(pos) //把b中pos處的二進位制位置為0
b.flip() //把b中所有二進位制位逐位取反
b.flip(pos) //把b中pos處的二進位制位取反
b.to_long() //返回乙個unsigned long值
os<
學習第三天
額,又是美好的一天!祝賀比利時奪得季軍!下面,還是先看資訊學 今天繼續看倍增。這道題是和倍增沾邊的題,額,其實就是兩邊floyd。但是思路還是可以借鑑的。這道的思路是,使用兩個陣列,乙個是f k u v 這個陣列表示節點u到節點v之間是否距離為2 k,如果是,則為1,否則為0.代表u和v之間是否1s...
學習第三天
等價類是建立在這種思想之上 即我們不可能進行窮舉測試,那麼我們就 必須對輸入進行分類,而這種分類是建立在我們知道計算機程式設計原理和 計算機處理單元的工作原理基礎之上的,程式是通過資料結構和演算法來實現 的,計算機是按照演算法來執行程式的,這種執行是穩定的,不會因為我們的 輸入而導致計算機處理不穩定...
學習第三天
ctrl c 複製 ctrl v 貼上 ctrl a 全選 ctrl x 剪下 ctrl z 撤銷 ctrl s 儲存 alt f4 關閉視窗 shift delete 永久刪除 windows r 執行 windows e 我的電腦 ctrl shift esc 任務管理器 開始 系統 命令提示符...