其他章節:C++ Primer 學習心得
標準庫類型string
表示可變長的字符序列,使用string
類型必須首先頭文件,string
定義在命名空間std
中
#include <string>
using std::string
定義和初始化string
對象
初始化類的對象是由類本身決定的,一個類可以定義很多種初始化對象的方式。
string s1 // 默認初始化,s1是一個空串
string s2(sl) // s2是s1的副本
string s2 = s1 // 等價于s2(s1),s2是s1的副本
string s3("value") // s3 是字面值"value"的副本,除了字面值最后的那個空字符外
string s3 = "value" // 等價于s3("value"),s3是字面值"value"的副本
string s4(n, 'c') // 把s4初始化為由連續n個字符c組成的字符串
直接初始化和拷貝初始化
- 使用等號(
=
)初始化一個變量,執行拷貝初始化,把等號右側的初始值拷貝到新創建的對象中去。 - 不使用等號(
=
),執行直接初始化。
初始值只有一個時,使用直接初始化或拷貝初始化都行;s4
樣式的初始化用到的值有多個,一般只能使用直接初始化。
string s5 = "hiya"; // 拷貝
string s6("hiya"); // 直接
string s7(10, 'c'); // 直接
多個值進行初始化的情況,也可以采用拷貝初始化,需要創建一個臨時對象用于拷貝:
string s8 = string(10, 'c'); // 拷貝
string
對象上的操作
os << s // 將s寫到輸出流os當中,返回os
is >> s // 從is中讀取字符串賦給s,字符串以空白分隔,返回is
getline(is,s) // 從is中讀取一行賦給s,返回is
s.empty() // s為空返回true,否則返回false
s.size() // 返回s中字符的個數
s[n] // 返回s中第n個字符的引用,位置n從0計起
s1 + s2 // 返回s1和s2連接后的結果
s1 = s2 // 用s2的副本代替s1中原來的字符
s1 == s2
s1 != s2 // 如果s1和s2中所含的字符完全一樣,則它們相等:string對象的相等性判斷對字母的大小寫敏感
<, <=, >, >= // 利用字符在字典中的順序進行比較,且對字母的大小寫敏感
讀寫string
對象
cin >> s;
:執行讀取操作時,string
對象自動忽略開頭的空白(空格符、換行符、制表符等),從第一個真正的字符讀起,直到遇見下一處空白。
string
對象的輸入輸出操作返回運算符左側的運算對象作為結果,多個輸入或輸出可以連寫在一起。
讀取未知數量的string
對象
while (cin >> word){}
條件負責檢測流的情況,流有效執行while
語句內部的操作;遇到文件結束標記或非法輸入,循環結束。
使用getline
讀取一整行
getline
:保留輸入時的空白符,參數是輸入流和一個string
對象,從輸入流中讀入內容,直到遇到換行符為止(換行符也讀入),將所讀內容存入string
對象(不保存換行符)。
getline
一遇到換行符就結束讀取并返回結果。getline
返回流參數,可以使用getline
的結果作為while
條件。
string
的empty
和size
操作
empty
:string
的成員函數,返回string
對象是否為空的一個對應的bool
值。
size
:返回string
對象的長度(字符的個數)。
string::size_type
類型
size
函數返回值的類型,使用時通過作用域操作符表明是在string
中定義的。- 無符號整數類型,足夠放下任何
string
對象的大小。表達式中避免混用帶符號數和無符號數,有size
函數就不要再使用int
。
比較string
對象
string
對象相等意味著他們的長度相同且包含的字符也完全相同。
運算符==,!=,<,<=,>,>=
依照在大小寫敏感的字典順序。
- 如果兩個
string
對象的長度不同,而且較短string
對象的每個字符都與較長string
對象對應位置上的字符相同,就說較短string
對象小于較長string
對象。 - 如果兩個
string
對象在某些對應的位置上不一致,則string
對象比較的結果其實是string
對象中第一對相異字符比較的結果。
為string
對象賦值
對于string
,允許把一個對象的值賦給另外一個對象:
string stl(10,'c'),st2; // st1的內容是cccccccccc;st2是一個空字符串
stl = st2; // 賦值:用st2的副本替換st1的內容,此時st1和st2都是空字符串
兩個string
對象相加
+
:得到新的string
對象,前半部分是+
左側string
對象所含字符,后半部分是+
右側string
對象所含字符。
+=
:復合賦值運算符,右側string
對象追加到左側string
對象的后面。
string sl = "hello, ", s2 = "world\n";
string s3 = sl + s2; //s3的內容是hello,world\n
s1 += s2; //等價于s1 = s1 + s2
字面值和string
對象相加
標準庫允許將字符和字符串的字面值轉換為string
對象,需要string
對象的地方可以使用這兩種字面值來替代。
當把string
對象和字符及字符串字面值混在一條語句中使用時,必須確保每個加法運算符+
的兩側的運算對象至少一個是string
。
- C++中字符串字面值并不是標準庫類型
string
的對象。
處理string
對象中的字符
cctype
頭文件中定義了一組標準庫函數處理字符。
alnum(c) // 當c是字母或數字時為真
isalpha(c) // 當c是字母時為真
iscntrl(c) // 當c是控制字符時為真
isdigit(c) // 當c是數字時為真
isgraph(c) // 當c不是空格但可打印時為真
islower(c) // 當c是小寫字母時為真
isprint(c) // 當c是可打印字符時為真(即c是空格或c具有可視形式)
ispunct(c) // 當c是標點符號時為真(即c不是控制字符、數字、字母、可打印空白中的一種)
isspace(c) // 當c是空白時為真(即c是空格、橫向制表符、縱向制表符、回車符、換行符、進紙符中的一種)
isupper(c) // 當c是大寫字母時為真
isxdigit(c) // 當c是十六進制數字時為真
tolower(c) // 如果c是大寫字母,輸出對應的小寫字母;否則原樣輸出c
toupper(c) // 如果c是小寫字母,輸出對應的大寫字母;否則原樣輸出c
使用C++版本的C標準庫頭文件
- C語言的頭文件形如
name.h
,C++將這些文件命名為cname
。 - 在名為
cname
的頭文件中定義的名字從屬于命名空間std
。
使用基于范圍的for
語句處理每個字符
范圍for
語句:遍歷給定序列中的每個元素并對序列中的每個值執行某種操作。
for (declaration: expression)statement
expression
部分是一個對象,用于表示一個序列declaration
部分負責定義一個變量,該變量將被用于訪問序列中的基礎元素。每次迭代,declaration
部分的變量會被初始化為expression
部分的下一個元素值。
string str("Some string");
for (auto c: str) // 對于str中的每個字符
- 使用auto關鍵字讓編譯器來決定變量
c
的類型,每次迭代,str
的下一個字符拷貝給c
。
使用范圍for
語句改變字符串中的字符
改變string
對象中的字符的值,必須把循環變量定義為引用類型。
string str("Some string");
for (auto &c: str) // 對于str中的每個字符
處理一部分字符
訪問string
對象中的單個字符,使用下標,使用迭代器。
下標運算符([]
)接受的輸入參數是string::size_type
類型的值,表示要訪問的字符的位置;返回值是該位置上字符的引用。
string
對象的下標從0
記起,s[s.size() - 1]
是最后一個字符。string
對對象的下標必須大于等于0而小于s.size()
。- 下標的值稱作“下標”或“索引”,任何表達式只要它的值是一個整形就能作為索引。如果某個索引是帶符號類型的值將自動轉換為無符號類型
string::size_type
。 - 訪問字符之前,首先檢查字符串是否為空。
使用下標執行迭代
for (decltype(s.size()) index = 0; index != s.size() && !isspace(s[index]); ++index)
使用下標執行隨機訪問
通過某個下標值,直接獲取對應位置的字符,并不是每次都需要從前往后依次訪問。