STL之字符串類模板 string(二)、C++ basic_string(字符串類模板)

  • “字符” 本身是個有趣的抽象概念。例如,在紙上或者屏幕上,字符 “C” 僅僅是一段曲線而已。在計算機中,用一個 8 Byte 存儲該字符,並賦值 67;字符 “C” 還是拉丁字母的第三個字母;在化學專業,字符 “C” 是原子碳的縮寫形式;在計算機學科中,字符 “C” 又被用來表示一種程序設計語言的名字。
  • 目前,在計算機領域,字符集合是在字符與整數值之間的一種映射關係。
    C++ 程序員通常假定能夠使用美國字符集(ASCII),但 C++ 允許程序員缺少某些字符的可能性。如果在程序開發過程中,源代碼含有 ASCII 裏所沒有的字符,這是比較麻煩的,許多語言(例如中文、丹麥文、法文、冰島文、日文)無法用 ASCII 中的字符正常寫出來,即使擴充到 16 位字符集,也無法將人類所知的所有字符放在同一字符集中。據說已經出現的 32 位字符集能保存每一個字符,但因字符數量龐大,不便於使用,尚未得到推廣。
    C++ 語言允許程序員使用任何字符集作爲字符串的字符,也允許程序員使用擴充字符集或可移植的數值編碼。從原則上講,字符串能以任何(帶有正確的複製操作)類型作爲其字符類型。標準字符串類 string 要求其中的字符不能包含用戶自定義複製操作,有助於字符串 I/O 的簡化與高效率。
    字符類型的性質是由字符特徵類(char_traits)定義的。字符特徵類是下述模板的特例:
template <class Ch> struct char_traits { }
  • 所有字符特徵類均定義在名稱空間 std 中,標準的字符特徵類由頭文件 <String> 給出。通用字符串特徵類 char_traits 本身不具有任何屬性,只有針對特定字符類型的專門 char_traits 才具有屬性。
    標準字符串模板的實例類 basic_string 依賴於諸多類型和函數。若一個類型作爲 basic_string 字符類型,必須提供支持上述功能的字符特徵類(char_traits)。
    C++ 的字符串模板實例化類 basic_string 中,還集合了大量的字符串處理函數,與標準容器類似。該類模板的聲明如下:
template <class Ch, class Tr = char_traits <Ch>, class A=allocator <Ch>> class std::basic_string
{
    public:
    ...
}
  • 在上述模板聲明中:
    • 第一個參數(class Ch)是說明單個字符(Ch)所屬型別(class)。
    • 第二個參數(class Tr = char_traits )是特性類別,用以提供字符串類別中的所有字符核心操作。該特性類別規定了“複製字符”或“比較字符”的做法;如果不指定該特性類別,系統會根據現有的字符型別採用默認的特性類別。
    • 第三個參數帶有默認值(class A = allocator),用以定義字符串類別所採用的內存模式,通常設定爲“默認內存模型 allocator”。該模板及其相關功能都定義在名稱空間 std 中,由頭文件 給出,其中包含了兩個定義類型,可以爲最常用的串類型提供便於使用的名稱,即 C++ STL 提供了兩個 basic_string<> 實例化版本:
typedef basic_string <char> string;
typedef basic_string <wchar> wstring;

其中,wstring 類是爲了便於使用寬字符集,例如 Unicode 或某些歐洲字符集。但所有字符串類型均使用相同接口,其用法和問題是相同的。在本教程中,仍以 string 表示任何字符串型別。
basic_string 和 vector 類似,而 basic_string 還提供典型的字符串操作,例如子串檢索。basic_string 沒有提供一組完整的操作函數。通常 string 不能直接使用數組或者 vector,爲了更好地支持 string 的常見應用,程序員在實現過程中需要儘量減少複製。尤其對於較短的字符串,不應使用自由存儲空間,但允許對較長的字符串進行簡單修改。
basic_string 沒有虛函數,這點和其他標準庫類型一致。當需要設計更復雜的文字處理類時,可考慮用它加以實現。
與其他標準容器相似,basic_string 提供了一組成員類型名,程序員能使用這些與串相關的類型。例如:

typedef Tr traits_type;
typedef typename Tr::char_type value_type
typedef A allocator_type
……

basic_string 除支持最簡單的 basic_string 之外,還支持許多不同種類的字符串,例如:

typedef basic_string <unsigned char> Ustring;
tyepdef basic_string <Jchar> Jstring; //日文字符串

無論如何定義字符串,模板 basic_string 的大量函數均可便捷地使用。模板 basic_string 能夠存放集合 Ch 中的任何字符,特別是 string 中的 ‘0’。“字符類型” Ch 的行爲必須像字符,但它不能包含用戶確定的複製構造函數、析構函數和複製賦值。
雖然字符串類 string 包含了諸多的成員和函數,但個別功能沒能夠實現,例如正則表達式和較複雜的文本處理功能。
總體而言,string 類似的字符串操作逐漸變得簡單了。程序員可以定義 string 類型的對象、string 類的重載操作符和成員函數,這使字符串操作變得非常容易。

參考來源:http://c.biancheng.net/view/1439.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章