第二章介紹內置類型,本章介紹抽象數據類型庫。
- 其中string和vector是兩種最重要的標準庫類型,前者支持可變長字符串,后者表示可變長的集合。
- 還有一種標準庫類型是迭代器,它是string和vector的配套類型,常被用于訪問string中的字符和vector中的元素。
第三章 字符串、向量和數組
頭文件不應包含using聲明。
標準庫類型string
#include <string>
using std::string
初始化string
直接初始化(direct initialization)
拷貝初始化(copy initialization):使用等號
string s1;
string s2(s1);
string s2 = s2;
string s3("hiya");
string s3 = "hiya";
string s4(10, 'c'); //s4的內容是cccccccccc
string對象上的操作
1. cout << s
2. cin >> s //將string對象讀入s,遇到空白停止
3. getline(is, s) //從輸入流is中讀取一行賦給s(換行符被讀取了,但被丟棄而沒有賦給s),返回is
4. s.empty() //s為空返回true,否則返回false
5. s.size()
6. s[n] //返回s中第n個字符的引用,位置n從0計起
7. s1 + s2 //返回s1和s2連接后的結果
8. s1 = s2
9. s1 == s2
10. s1 != s2
11. <, <=, >, >=
邏輯非運算符(。
string::size_type類型:s.size()的返回值類型,是string類的配套類型。它是一個無符號類型的值,能夠存放下任何string對象的大小。
處理string對象中的字符
cctype頭文件:對單個字符的判斷或處理的函數
isupper(c) //c是大寫字母時為真
islower(c)
tolower(c) //如果c是大寫字母,則輸出對于的小寫字母;否則原樣輸出
toupper(c)
isalpha(c) //c是字母時為真
isdigit(c) //c是數字時為真
isalnum(c) //c是字母或數字時為真
ispunct(c) //c是標點符號時為真
isspace(c) //c是空白時為真(即c是空格、橫向制表符、縱向制表符、回車符、換行符、進紙符的一種)
iscntrl(c) //c是控制字符時為真
isgraph(c) //c不是空格但可打印時為真
isprint(c) //c是可打印字符時為真(即c是空格或具有可視形式)
isxdigit(c) //十六進制數
使用C++版本的C標準庫頭文件,形如name.h,C++++中這些文件命名為cname,內容一樣,且頭文件cname中定義的名字從屬于命名空間std。
范圍for(range for)語句
for (declaration : expression)
statement
例如:
string str("some string");
//每行輸出str中的一個字符
for(auto c : str)
cout << c <<endl;
標準庫類型vector
vector是一個類模板(class template)。vector表示對象的集合,其中所有對象的類型都相同。集合中的每個對象都有一個與之對應的索引,索引用于訪問對象。vector也常被稱為容器(container).
定義和初始化vector對象
vector<T> v1
vector<T> v2(v1)
vector<T> v2 = v1
vector<T> v3(n, val)
vector<T> v4(n)
vector<T> v5{a,b,c...}
vector<T> v5 = {a,b,c...}
列表初始化vector對象
vector<string> articles = {"a", "an", "the"};
1
向vector對象中添加元素
push_back:把一個值當成vector對象的尾元素“壓到(push)”vector對象的“尾端(back)”。
vector<int> v2;
for(int i=0; i != 100; ++1)
v2.push_back(i);
運行時才知道vector對象中確切的個數:
string word;
vector<string> text;
while (cin >> word) {
text.push_back(word);
}
vector對象能高效增長:vector能在運行時高效快速地添加元素。
如果循環體內包含有向vector對象添加元素的語句,則不能使用++范圍for++循環。
其他vector操作
v.empty()
v.size()
v.push_back(t)
v[n] //返回v中第n個位置上元素的引用
v1 = v2
v1 = {a,b,c...}
v1 == v2
v1 != v2
<, <=, >, >=
迭代器iterator
一種通用機制:實現使用下標運算符訪問string對象的字符或vector對象的元素。
類似指針類型,提供了對對象的間接訪問。
begin和end成員
//由編譯器決定b、e的類型
//b表示v的第一個元素,e表示v尾元素的下一個元素
auto b = v.begin(), e = v.end(); //b、e類型相同
end成員返回的迭代器常被稱作尾后迭代器(off-the-end iterator),或者簡稱尾迭代器。
如果容器為空,則begin和end返回的都是尾后迭代器。
標準容器迭代器運算符
*iter 返回迭代器iter所指元素的引用
iter->men 解引用iter并獲取鈣元素的名為mem的成員,等價于(*iter).mem
++iter
--iter
iter1 == iter2
iter1 != iter2
//將字符串首字母改成大寫
string s("some string");
if (s.begin() != s.end()) {
auto it = s.begin();
*it = toupper(*it);
}
//將迭代器從一個元素移動到另一個元素,把字符串中第一個單詞改為大寫
//注意,使用的是!=,而不是<
for(auto it = s.begin(); it != s.end() && !isspace(*it); ++it)
*it = toupper(*it);
#### 迭代器類型
擁有迭代器的標準庫使用iterator和const_iterator來表示迭代器的類型:
vector<int>::iterator it; //it能讀寫vector<int>中的元素
string::iterator it2; //it2能讀寫string對象中的字符
vector<int>::const_iterator it3; //it3只能讀元素,不能寫元素
string::const_iterator it4; //it4只能讀字符,不能寫字符