C 學習筆記,堅持自律!

2021-10-14 11:08:45 字數 3809 閱讀 6560

二、字串、向量和陣列

2.vector

auto是讓編譯器自己去分析表示式所屬的型別

它會忽略頂層const,如果希望是頂層的,則需宣告出來

int i=1;

const

int ci=i,

&cr=ci;

auto b=ci;

//b是乙個整數,ci的頂層const被忽略掉了

auto c=cr;

//c是乙個整數,同上

auto d=

&i;//d是乙個整型指標

auto e=

&ci //e是乙個指向整數常量的指標,底層const

const

auto f=ci;

//ci的推演型別是int,f是const int

選擇並返回運算元的資料型別

decltype((variable))的結果永遠是 引用

decltype(variable)的結果只有當variable本身就是乙個引用時才是引用

decltype(f

()) sum=x;

//sum的型別就是函式f的返回型別

decltype

((i)

) d;

//錯誤:d是int&,必須初始化

decltype

(i) d;

//正確:e是乙個(為初始化的)int

using:標頭檔案不應包含using

string s1;

//預設初始化,s1是乙個空字串

string s2

(s1)

;//s2是s1的副本

string s2=s1;

//同上

string s3

("value");

//s3是字面值"value"的副本,除了字面值最後的那個空字元外

string s

(n,'c');

//把s初始化為由連續n個字元c組成的字元

操作

作用os《將s寫到輸出流os中,返回os

is《從is中讀取字串賦給s,字串以空白分隔,返回is

getline(is,s)

從is中讀取一行賦給s,返回is

s.empty()

判斷為空返回true,不為空返回false

s.size()

返回s中字元的個數

s[n]

s中第n個字元,n從0開始

s1+s2

s1和s2連線

s1=s2

賦值s1==s2

判斷s1!=s2

對大小寫敏感

<,<=,>,>=

利用字元在字典中的順序進行比較,對大小寫敏感

①使用getline讀取一整行

如果直接用 cin 輸入的話,他會從第乙個非空白符開始讀取,直到遇見下一處空白為止。

若想要那被忽略掉的空白符,那麼就會用到getline語句。

**如下(示例):

string line;

//每次讀取一行,直到檔案末尾?

while

(getline

(cin,line)

) cout << line << endl;

//line中不包含換行符,需要手動新增

②處理string物件中的字元

此處用到了標頭檔案 cctype 操作

作用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是十六進製制時為真

tolower( c )

如果c是大寫字母,則輸出小寫字母,否則原樣輸出

toupper( c )

與上相反

要想處理string中的一部分字元

一種是可以像c那樣使用下標;

還有一種是使用迭代器(??)

//處理每個字元,用基於範圍的for語句

string str

("some string");

//每行輸出str中的乙個字元

for(

auto c:str)

cout << c << endl;

學完vector之後,第一印象是感覺這個有點像資料結構裡邊講的棧,但它比棧靈活多了

1、引用不可以成為vector的元素,因為他不是物件

2、可以用花括號初始化每乙個值

3、可以用括號指定元素個數或相同的元素值

4、只能使用直接初始化,不可以使用拷貝初始化(只有在型別相同的時候才可以拷 貝)

5、適用於三種情況:①初始值已知且數量較少

②初始值是另乙個vector物件的副本

③所有元素的初始值都一樣

舉個書上的例子

vector<

int> v;

//空vector物件

for(

int i=

0;i!=

100;

++i)

v.push_back

(i);

//依次把整數值放到v的尾端,相當於棧的**

//迴圈結束後v有100個元素,從0到99

這些操作基本上和string的一些操作差不多 操作

作用v.empty()

如果v不含有任何元素,返回真;反之,則假

v.size()

v中元素的個數

v[n]

返回v中第n個位置上元素的引用

v1=v2

用v2中元素的拷貝替換v1中的元素

v1=用列表中元素的拷貝替換v1中的元素

v1==v2

v1和v2相等當且僅當它們的元素數量相同且對應位置的元素值都相同

<,<=,>,>=

以字典順序進行比較

vector的下標型別和string的一樣,都是 size_type 型別。

不能用下表形式新增元素

舉個栗子

比如向vector物件中新增10個元素

vector<

int> v;

//空vector物件

for(decltype ( v.

size()

) i=

0;i!=

10;i++

) v[i]

=i;for

(decltype ( v.

size()

) i=

0;i!=

10;i++

) v.

push_back

(i);

在這裡邊,第乙個for迴圈是錯誤的,v是乙個空vector,不包含任何元素,所以也就不存在可以通過下標去訪問元素。

要想新增元素,就目前而言,只能用push_back(t),向尾端新增元素。

學習貴在堅持

重新學資料結構和演算法有兩三周時間了,從之前頭大到看懂一點,到看的差不多,有幾次處於崩潰邊緣,雖然有些還是模模糊糊的,但是已經深刻感受到資料結構和演算法的魅力,也知道了解決問題的方式,之前學東西不會了,不知道找卡住的點,現在知道了,一旦乙個東西不懂了,就會去找卡住自己的點在哪,是有些概念不明白,還是...

堅持c 學習,真正掌握c (1)

今天全面複習了c primer中的第七章函式部分,複習了函式的宣告,定義,過載以及內聯函式的使用。最後複習了指向函式的指標。下面是我的複習心得 1.c 為了相容c語言,以下的兩種函式宣告是同樣的,因為const int形參既接受const實參也接受非const實參,所以沒有區別 int f int ...

C 之路 堅持

乙個典型的 c 程式設計師成長經歷 1.完整的學一遍 c 所有語言特性,典型書籍 the c programming language part1,part2,c primer 感覺 c 像大雜燴 多程式設計范型 各種精妙的語法特性 friend,virtual rtti,const mutable...