第3章 字串 向量和陣列

2021-10-19 02:54:42 字數 4244 閱讀 8461

using 宣告語句:編譯器從操作符左側所示作用域尋找右側那個名字

using namespace :: name

注:標頭檔案中不能有using宣告,標頭檔案中的內容會拷貝到所引用它的檔案中去,會引起名字衝突

標準庫型別string:表示可變長的字串行。包含在string標頭檔案

string的初始化方式

string s1

string s2(s1) s2是s1的副本

string s2 = s1 s2是s1的副本

string s3(「value」) s3是value的副本,除了字面值最後那個空字元

string s3 = 「value」

string s4(n,『c』) s4初始化為連續n個字元c組成的字串

直接初始化和拷貝初始化(參考上述例子)

string 物件上的操作

s[n]、s.empty( )、s.size()、getline(is,s)等

getline(is,s):從is中讀取一行賦給s,返回is

string物件會自動忽略開頭的空白並從第乙個真正的字元開始讀起,直到遇到下一處空白。

**string :: size_type **

s.size()函式返回的是size_type型別。該型別是string類及其他大多數標準庫型別都定義了幾種配套的型別。

size_type是一種無符號型別的值。不能與int等有符號數混用,會產生意想不到的結果。例s.size()注:在string比較中,比較規則。(字元相異)

string的運算子(+)的兩側至少有一側是string物件

錯誤示例: string s1 = 「hello」 + ", " + s2 (其中s2是string 物件)

c語言中的標頭檔案形如name.h在c++中命名為cname

處理str中每個字元(**塊中的部分函式為string標準庫型別中的)

string s

("some string");

for(

auto c : s)

cout << c

for(

auto

&c : s)

c =toupper

(c);

cout << s

for(

decltype

(str.

size()

) index =0;

index != s.

size()

&&!isspace

(s[index]);

++index)

s[index]

=toupper

(s[index]

);

標準庫型別vector表示物件的集合,其中所有的物件型別都相同,且所有物件都有索引,用於訪問物件。同時,vector也被稱為「容器」。vector是乙個類模板。c++中有類模板也有函式模板。

除string的初始化方式外,vector多了個列表初始化。

vector  v1 =

;vector v1

;//兩種方式是等價的

//錯誤示例:編譯器檢測到與元素型別不同,會執行預設初始化。

vector v1

;vector v1

;//這兩種方式會得到有10個預設初始化的元素

vector物件上的操作不做具體介紹。

迭代器有有效和無效之分。有效的迭代器或者指向某個元素,或者指向容器中尾元素的下一位

auto b = v.

beign()

,e = v.

end();

//b表示v的第乙個元素,e表示v的尾元素的下一位置

如果容器為空,則v.begin()與v.end()返回的是同乙個迭代器,都是尾後的迭代器。

此時需要用解引用改變字元。例如:

for

(auto it = v.

begin()

;it != v.

end()&&

!isspace

(*it)

;++it)

*it =

toupper

(*it)

;

迭代器型別

vector<

int> v ;

const vector<

int> cv;

auto it1 = v.

begin()

;//it1是vector:: iterator型別

auto it2 = cv.

begin()

;//it2是vector:: const_iterator型別

const_iterator型別只可以讀不可以寫。

為了得到const_iterator型別c++11新標準引入cbegin()和cend()函式。

迭代器呼叫函式時,正確的是(*it).empty( ),錯誤的是 *it.empty( )

c++語言定義了箭頭運算子(->)。箭頭運算子把解引用和成員訪問函式兩個操作結合在一起。it->mem和 (*it).mem相同。

陣列與vector不同點是陣列的大小確定,不能隨意向陣列中增加元素。

string a[b]

;//當b為常量時正確,否則錯誤。

int*parr[42]

;//含有42個整型指標的陣列。

不允許拷貝和賦值

int a =

;int a2[

]= a;

//錯誤,不允許乙個陣列初始化另乙個陣列。

a2 =a ;

//錯誤,不允許把乙個陣列直接賦值給另乙個陣列。

int(

*p)[10]

;int

(&p2)[10

];

指標和陣列

使用陣列時,編譯器一般會把它轉化為指標。使用指標訪問陣列元素時注意解引用

string nums = ;

string *p = nums; //等價於 p = &nums[0];

陣列也具有begin()和end(),並於vector相同。

注意:函式strlen( a );其中a必須是以空字元結束。且不能用 string初始化 char*

用陣列初始化vector物件

int int_arr=

;vector<

int>

ivec

(begin

(int_arr)

,end

(int_arr)

);

多維陣列的迭代

//ia為乙個二維陣列

for(

auto

&i : row)

for(

auto col: row)

//若要進行寫操作需要寫為 &col

cout << col << endl;

使用引用符&為了避免陣列被自動轉化為指標。

第3章 字串向量和陣列

1 標頭檔案不應該包含using宣告 2 直接初始化string str or string num,char 拷貝初始化 string str str2 3 getling cin,line 讀取一行直到遇到第乙個換行符讀取並丟棄換行符 4 如果一條語句中有size 函式,就不用int避免混用 5...

C Primer 第3章 字串 向量和陣列

6 多維陣列 using namespace name 標頭檔案不應包含using宣告 使用等號 初始化乙個變數,實際上執行的是拷貝初始化,編譯器把等號右側的初始值拷貝到新建立的物件中去。如果不使用等號,則執行的是直接初始化。常用操作 getline is,s 從is中讀取一行賦給s,返回is s....

字串 向量和陣列

迭代器介紹 陣列定義和初始化string物件 string物件上的操作 處理string物件中的字元 定義和初始化 vector v1 vector v2 v1 v2中包含有v1中所有元素的副本 vector v2 v1 等價於v2 v1 vector v3 n,va1 v3包含n個重複的v1 ve...