一.string #include <string> using std::string 初始化函數: string s1; 默認構造函數 s1 為空串 string s2(s1); 將 s2 初始化為 s1 的一個副本 string s3("value");將 s3 初始化為一個字符串字面值副本 string s4(n, 'c');將 s4 初始化為字符 'c' 的 n 個副本 string s4(5,'6') 66666 為了與 C 語言兼容,字符串字面值與標准 庫 string 類型不是同一種類型。 cin >> s; 從標准輸入讀取 string 並將讀入的串存儲在 s 中。string 類型的輸入操 作符: • 讀取並忽略開頭所有的空白字符(如空格,換行符,制表符)。 • 讀取字符直至再次遇到空白字符,讀取終止。 讀入未知數目的string對象《每行輸出一個單詞》 string str; while (cin>>str) { cout<<str<<endl; } 使用getline讀取正行文本《每次輸出一行文本》 string line; while (getline(cin,line)) { cout<<line<<endl; } 字符串操作符 s.empty() 如果 s 為空串,則返回 true,否則返回 false。 s.size() 返回 s 中字符的個數 返回類型:string::size_type。 s[n] 返回 s 中位置為 n 的字符,位置從 0 開始計數 s1 + s2 把 s1 和 s2 連接成一個新字符串,返回新生成的字符串 s1 = s2 把 s1 內容替換為 s2 的副本 v1 == v2 比較 v1 與 v2 的內容,相等則返回 true,否則返 回 false !=,<,<=,>,and> 保持這些操作符慣有的含義 #include<CCType.h> cctype 中的函數 isalnum(c) isalpha(c) iscntrl(c) isdigit(c) isgraph(c) islower(c) isprint(c) ispunct(c) isspace(c) isupper(c) isxdigit(c) tolower(c) toupper(c) 如果 c 是字母或數字,則為 True。 如果 c 是字母,則為 true。 如果 c 是控制字符,則為 true 如果 c 是數字,則為 true。 如果 c 不是空格,但可打印,則為 true。 如果 c 是小寫字母,則為 true。 如果 c 是可打印的字符,則為 true。 如果 c 是標點符號,則 true。 如果 c 是空白字符,則為 true。 如果 c 是大寫字母,則 true。 如果是 c 十六進制數,則為 true。 如果 c 大寫字母,返回其小寫字母形式,否則直接返回 c。 如果 c 是小寫字母,則返回其大寫字母形式,否則直接返回 c。 建議采用 C 標准庫頭文件的 C++ 版本, #include <cctype> C建議采用此版本 #include <ctype.h> C++ ------------------------------------------------- 二.vector 是同一種類型的對象的集合 #include<vector> using std::vector; vector<int> ivec;//vector不是一種數據類型,而是一種類模板,vector<int>是一種數據類型 初始化 vector<T> v1; vector 保存類型為 T 對象。 默認構造函數 v1 為空。 vector<T> v2(v1);  v2 是 v1 的一個副本。 vector<T> v3(n, i); v3 包含 n 個值為 i 的元素。   vector<T> v4(n); vector<int>v4(10); v4 含有值初始化的元素的 n 個副本。10 elements, each initialized to 0 vector 對象的操作 vector 標准庫提供了許多類似於 string 對象的操作 v.empty() 如果 v 為空,則返回 true,否則返回 false。  v.size() 返回 v 中元素的個數。vector<int>::size_type num;  v.push_back(t) 在 v 的末尾增加一個值為 t 的元素。 v[n] 返回 v 中位置為 n 的元素。 v1 = v2 把 v1 的元素替換為 v2 中元素的副本。 v1 == v2 如果 v1 與 v2 相等,則返回 true。  !=, <, <=, >, and >= 保持這些操作符慣有的含義 關鍵概念:安全的泛型編程 習慣於 C 或 Java 編程的 C++ 程序員可能會覺得難以理解,for 循環 的判斷條件用 != 而不是用 < 來測試 vector 下標值是否越界。C 程序 員難以理解的還有,上例中沒有在 for 循環之前就調用 size 成員函數 並保存其返回的值,而是在 for 語句頭中調用 size 成員函數。 C++ 程序員習慣於優先選用 != 而不是 < 來編寫循環判斷條件。在上例 中,選用或不用某種操作符並沒有特別的取捨理由。學習完本書第二部 分的泛型編程後,你將會明白這種習慣的合理性。 調用 size 成員函數而不保存它返回的值,在這個例子中同樣不是必需 的,但這反映了一種良好的編程習慣。在 C++ 中,有些數據結構(如 vector)可以動態增長。上例中循環僅需要讀取元素,而不需要增加新 的元素。但是,循環可以容易地增加新元素,如果確實增加了新元素的 話,那麼測試已保存的 size 值作為循環的結束條件就會有問題,因為 沒有將新加入的元素計算在內。所以我們傾向於在每次循環中測試 size 的當前值,而不是在進入循環前,存儲 size 值的副本。 我們將在第七章學習到,C++ 中有些函數可以聲明為內聯(inline)函 數。編譯器遇到內聯函數時就會直接擴展相應代碼,而不是進行實際的 函數調用。像 size 這樣的小庫函數幾乎都定義為內聯函數,所以每次 循環過程中調用它的運行時代價是比較小的。 每種容器類型都定義了自己的迭代器類型,用於訪問容器內的元素,即,每個容器都定義了一個自己的 iterator 如 vector: vector<int>::iterator iter; 1.begin()/ end() for (vector<int>::iterator iter = text.begin();iter != text.end() ; iter++) { *iter = 4; } 只能讀取容器內元素,但是不可以改變 vector<int>::const_iterator 2.算數操作 iter + n; iter1-iter2 defference_type 三.bitset #include<bitset> using std::bitset; 初始化 bitset<n> b; // b 有 n 位,每位都 0 bitset<32> b;  bitset<n> b(u);// b 是 unsigned long 型 u 的一個副本 bitset<32> b(0xffff); // bits 0 ... 15 are set to 1, 16 ... 31 are 0 bitset<n> b(s); // b 是 string 對象 s 中含有的位串的副本 string strval("1100"); bitset<32> bitvec4(strval);//從 string 對象讀入位集的順序是從右向左(from right to left):bitvec4 的位模式中第 2 和 3 的位置為 1,其余位置都為 0。如果 string 對 象的字符個數小於 bitset 類型的長度,則高階位置為 0。  bitset<n> b(s, pos, n);//b 是 s 中從位置 pos 開始的&nbps;n 個位的副 string str("1111111000000011001101"); bitset<32> bitvec5(str, 5, 4); // 4 bits starting at str[5], 1100 位操作 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.reset() 把所有二進制位設為0  b.set(pos) 把 b 中在 pos 處的二進制位置為 1 flip 操作可以對 bitset 對象的所有位或個別位取反: bitvec.flip(0); // reverses value of first bit bitvec[0].flip(); // also reverses the first bit bitvec.flip(); // reverses value of all bits