C Primer學習第三天

2021-04-17 22:11:56 字數 4253 閱讀 3374

第三章 標準庫型別

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 任務管理器 開始 系統 命令提示符...