一、標準庫型別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...