第三章 標準庫類型
3.1 命名空間的using聲明
- 如果在頭文件中放置 using 聲明,就相當於在包含該頭文件 using 的每個程序中都放置了同一 using.
3.2 標準庫string
方式 |
描述 |
shting s1; |
默認構造爲空串 |
string s2(s1) |
把s1賦值給s2 |
string s3(“value”) |
賦值 |
string s4(n, ‘c’) |
s4爲n個’c’ |
- 因爲歷史原因以及爲了與 C 語言兼容,字符串字面值與標準
庫 string 類型不是同一種類型。這一點很容易引起混亂,編程時一定要注意區分字符串字面值和 string 數據類型的使用,這很重要。
- 標準輸入讀取string並存儲於s:
%1.讀取並忽略開頭所有的空白字符(如空格,換行符,製表符)。
%2.讀取字符直至再次遇到空白字符,讀取終止。
string s;
cin >> s;
如輸入"Hello world",則屏幕輸出爲"Hello",即s中不包括空格後的部分.
- string的輸入操作符也會返回所讀的對象流,因此可以以下代碼讀取一組string直至EOF(文件結束符)。
int main() {
string s;
//讀取多個string對象直至EOF!
while(cin >> s) {
cout << s << endl;
}
return 0;
}
- 使用getline讀取一行文本
getline接受兩個參數:一個輸入流對象和一個string對象。getline不忽略開頭的換行符,getline遇到換行符便停止並返回(換行符不會被儲存在string對象中)。若第一個輸入便是換行符,則getline立即返回,string對象也被置爲空字符串。getline返回值是輸入流對象。
// 該程序每次讀取並輸入一行文本。
int main() {
string line;
while(getline(std::cin, line)) {
std::cout << line << endl;
}
return 0;
}
操作 |
描述 |
s.empty() |
空串返回true,否則返回false |
s.size() |
返回字符個數 |
s1 + s2 |
連接兩個字符串 |
s1 == s2 |
相等返回true |
- 字符串比較:
%1.從左到右找第一個不相等的字符,比較字典序。若其中一個字符串直至結束也未找到不相等的字符,則長的字符串較大。
s1 = "abc"
s2 = "abcd"
s3 = "abd"
// s3 > s2 > s1
- 當進行 string 對象和字符串字面值混合連接操作時,+操作符的左右操作數必須至少有一個是 string 類型的.
-
string s1 = "hello";
string s2 = s1 + "," + "abc";
/*
**合法,可以拆解爲 :
**string temp = s1 + ","
**string s2 = temp + "abc"
*/
string s3 = "abc" + "," + s1;
/*
**非法操作
**拆解爲 string temp = "abc" + "," 這一步非法
**
*/
函數 |
功能 |
isspace(char c) |
空格返回true |
isdigit(char c) |
數字返回true |
isalnum(char c) |
數字或字母返回true |
isalpha(char c) |
字母返回true |
tolowert(char c) |
轉換爲小寫 |
toupper(char c) |
轉換爲大寫 |
3.3標準庫vector
- vector 是同一種類型的對象的集合,每個對象都有一個對應的整數索引值.它是一種容器.
- 需包含頭文件 #include
- vector初始化方式:
// vector初始化
vector<int> a; //默認a爲空
vector<int> b(a); //b是a的一個副本
vector<int> c(n, i);//c是包含n個i元素
vector<int> d(n); //d是包含n個初始化元素
- 如果 vector 保存內置類型(如 int 類型)的元素,那麼標準庫將用 0 值
創建元素初始化式。
- 如果 vector 保存的是含有構造函數的類類型(如 string)的元素,標準庫將用該類型的默認構造函數創建元素初始化式。
- vector常用操作:
vector<int> v;
v.empty(); //爲空返回true
v.size(); //返回vector長度(即元素個數)
v.push_back(i); //在末尾添加一個元素
v.front(); //返回第一個元素的引用
v.back(); //返回最後一個元素的引用
v.insert(index, i); //在下標爲index的位置插入新元素,即插入後新元素的下標爲index
v.pop_back(); //刪除末尾元素
v.erase(index); //刪除下標爲index的元素
v.erase(start, end);//刪除下標在[start, end)的元素,包括start但不包括end。
- 不能對一個空的vector對象直接用下標賦值,因爲下標只能獲取已經存在的元素,不能添加元素。
vector<int> v;
v[0] = 1; //非法操作。
v.push_back(1); //正確。
3.4 迭代器
- 迭代器(iterator)。迭代器是一種檢查容器內元素並遍歷元素的數據類型。
vector<int>::iterator iter; //定義一個名爲 iter 的迭代器
iter = v.begin(); //iter指向v[0]
std::cout << *iter <<endl; //使用解引用操作符 * 來獲取指向的元素,這裏輸出v[0]
- == 或 != 操作符來比較兩個迭
代器,如果兩個迭代器對象指向同一個元素,則它們相等,否則就不相等。
//使用迭代器遍歷vector賦值
for(vector<int>::iterator iter = v.begin();
iter != v.end(); ++iter) {
*iter = 0;
}
- const_iterator的類型,該類型只能用於讀取容器內元素,但不能改變其值。對 const_iterator 類型解引用時,則可以得到一個指向 const 對象的引用,該對象不能修改。
- 不要把 const_iterator 對象與 const 的 iterator 對象混淆起來。聲明一個 const 迭代器時,必須初始化迭代器。一旦被初始化後,就不能改變它的值。
- 任何改變 vector長度的操作都會使已存在的迭代器失效。
3.5 標準庫bitset
- 需包含頭文件 #include
- bitset對象初始化方法
bitset<n> b; //b有n位,全爲0
bitset<n> b(u); //b是 unsigned long 型 u 的一個副本
bitset<n> b(s); //b 是 string 對象 s 中含有的位串的副本
bitset<n> b(s, pos, n); //b 是 s 中從位置 pos 開始的;n 個位的副本
- 給出的長度值必須是常量表達式,長度值值必須定義爲整型字面值常量或是已用常量值初始化的整型的 const 對象。
bitset<32> bitvec; // 32 bits, all zero
b.any(); //b中是否存在置爲 1 的二進制位?
b.none(); //b中是否存在置爲1的二進制位
b.count(); //b中爲1的二進制位數
b.test(pos); //b 中在 pos 處的二進制位置爲 1 麼?
b.set(); //b置1
b.set(pos); //pos位置1
b.reset(); //置0
b.flip(); //按位取反