三 字串 向量和陣列

2021-06-28 06:56:36 字數 4250 閱讀 1359

一、標準庫型別string

1、使用等號(=)初始化乙個變數,執行的是拷貝初始化,編譯器把等號右側的初始值拷貝到新建立的物件中;如何不使用等號,則執行的是直接初始化。

2、os<

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

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

3、string::size_type型別。是乙個無符號型別的值且能存放任何string物件的大小。所有用於存放string類的size函式返回值變數,都應該是string::size_type型別的。

//如果兩個string物件的長度不同,且較短string物件的每個字元都與較長string物件對應位置上字元相同,則較短string物件小於較長string物件

//如果兩個string物件在某些對應位置不一致,則string物件比較的結果是string物件中第一隊相異字元比較的結果。

//所以,strstr , slang>phrase

string str = "hello";

string phrase = "hello world";

string slang = "hiya";

4、把string物件和字元字面值及字串字面值混在一條語句中使用時,必須確保每個加法運算子(+)的兩側的運算物件至少有乙個是string。

5、字串字面值與string是不同的型別。

二、標準庫型別vector

1、使用vector需包含標頭檔案#include ;

vector是乙個類模板,vectorvar;

引用不是物件,所以不存在包含引用的vector。

vectorsvec;          //預設初始化,svec不含任何元素

vectorivec;

vectorivec2(ivec); //把ivec的元素拷貝給ivec2;

//列表初始化

vectorarticles = ;

vectorarticles1;

vectorarticles2( "a", "an", "the" );//錯誤,列表初始化只能放在花括號裡進行,不能放於圓括號。

vectorivec(10, -1); //10個int型別的元素,都被初始化為-1;

vectorsvec(10, "hi!") //10個string型別的元素,都被初始化為「hi!」。

vectorvi = 10; //錯誤:必須使用直接初始化的形式指定向量大小

2、向vector物件中新增元素。常常先建立乙個空vector,在運用其成員函式push_back向其新增元素。

push_back負責把乙個值當成vector物件的尾元素「壓入」vector物件的尾端。

vectorv1;              //空vector物件

for (int i = 0; i != 100; ++i)

3、vector物件(以及string物件)的下表運算子可用於訪問已存在的元素,不能用於新增元素。

#include #include #include using namespace std;

int main()

for (vector::size_type ix = 0; ix != v.size(); ++ix) //將所有詞大寫後輸出

cout << v[ix] << endl;

} return 0;

}

三、迭代器

1、迭代器成員begin和end。begin成員負責返回指向第乙個元素的迭代器,end成員負責返回指向容器「尾元素的下一位置」的迭代器。如果容器為空,則begin和end返回的是同乙個迭代器,都是尾後迭代器。

2、*iter  返回迭代器iter所指元素的引用;

iter->mem     解引用iter並獲取該元素的名為mem的成員,等價於(*iter).mem

string s("some string");

if (s.begin() != s.end())

3、迭代器型別。擁有迭代器的標準庫型別使用iterator和const_iterator來表示迭代器的型別。

示例:

vector::iterator it;         //it能讀寫vector的元素

string::iterator it1; //it1能讀寫string物件中的字元

vector::const_iterator it2; //it2只能讀,不能寫元素

string::const_iterator it3; //it3只能讀字元,不能寫

4、begin和end返回型別由物件是否為常量決定。若物件是常量,則返回const_iterator。

為了便於專門得到const_iterator型別返回值,引入函式cbegin和cend。不論vector(或string)物件本身是否為常量,返回值都是const_iterator。

5、凡是使用了迭代器的迴圈體,都不要向迭代器所屬容器新增元素。

四、陣列

陣列也是存放型別相同物件的容器,這些物件本身沒有名字,需要通過其所在位置訪問。陣列大小確定不變,不能隨意向陣列中新增元素。

1、陣列宣告形如a[d],其中a為陣列名,d是陣列維度。維度必須是乙個常量表示式。

2、不能將陣列的內容拷貝給其他陣列作為其初始值,也不能用陣列為其他陣列賦值。

3、理解陣列宣告的含義,最好從陣列的名字開始按照由內到外順序閱讀。

4、使用陣列下標時,通常定義為size_t型別。size_t是一種機器相關的無符號型別,它被設計的足夠大以便能表示記憶體中任意物件的大小。

習題3.31

#include #include #include using namespace std;

int main()

//拷貝為另乙個陣列

int b[10];

for (int i = 0; i != 10; ++i)

//使用vector實現類似功能

vectorv(10, 20);

vectorv2;

for (vector::iterator iter = v.begin(); iter != v.end(); ++iter)

return 0;

}

5、在大多數表示式中,是用陣列型別的物件其實就是使用乙個指向該陣列首元素的指標。

示例

int ia = ; //ia是乙個含有10個整數的陣列

auto ia2(ia); //ia2是乙個整型指標,指向ia的第乙個元素

ia2 = 42; //錯誤:ia2是乙個指標

6、標準庫函式begin和end,與容器的兩個同名函式功能類似。

用法:

int ia = ; //ia是乙個含有10個整數的陣列

int *beg = begin(ia); //指向ia的首元素的指標

int *last = end(ia); //指向ia尾元素的下一位置的指標

其中尾後指標不能執行解引用和遞增操作。

7、下標與指標。

示例

int ia = ;

int *p = &ia[2]; //p指向索引為2的元素

int j = p[1]; //p[1]等價於*(p+1),就是ia[3]表示的那個元素

int k = p[-2]; //p[-2]是ia[0]表示的那個元素

標準庫限定使用的下標必須是無符號型別,內建的下標運算無此要求,如內建下標運算子可以處理負值。

五、多維陣列

嚴格來說,c++語言中沒有多位陣列,通常所說的多維陣列其實是陣列的陣列。使用範圍for語句處理多位陣列時,除了最內層的迴圈外,其他所有迴圈的控制變數都應該是引用型別,這是為了避免陣列被自動轉成指標。

示例

int ia[3][4] = , //第一行的初始化

, }; size_t cnt = 0;

for (auto &row : ia) //對於外層陣列的每乙個元素

}

三 字串 向量 陣列

直接初始化和拷貝初始化 string s1 10,c string s2 string 10,c 會影響效能 s1.size 返回物件中字元的個數,型別為string size type,是無符號型別,不要與有符號型別混用 範圍 for string str some string for auto...

C 學習筆記三 字串 向量和陣列

標準庫型別string表示可變長的字串行,使用之前必須包含string標頭檔案,string定義在命名空間std中。在執行讀寫操作時,string物件會自動忽略開頭的空白 即空格符 換行符 製表符等 並從第乙個真正的字元讀起,直到遇到下一處空白為止。include include using nam...

三 字串 一

三 字串 1。直接量三種寫法 1 單引號,不會替換變數,且只支援 兩個轉譯字元 2 雙引號,會進行變數替換,雙引號能支援除了 以外的所有轉譯符 3 heredoc,比如 string end of string haha hehe hoho.hehe end of string 其中end of s...