設計乙個完美的string是不可能的,但是無論如何,這個string為許多需要提供了很好的服務。
字符集就是在字元和整數值之間的一種對映。c++的方式就是允許程式設計師使用任何字符集作為串的字元型別。原則上講,串能以任何帶有正確的複製操作的型別作為其字元型別,然而對於那些沒有使用者自定義複製操作的型別,他可以改進效率並簡化實現。因此標準庫string要求作為其字元型別的型別不包含使用者定義複製操作。
乙個字元型別的性質由其char_traits定義。
char_traits就是模板的乙個專門特化:
// class __char_traits_base.
template class __char_traits_base // char_type的複製操作 =
// 字元的整數表示
static char_type to_char_type(const int_type& __c)
static int_type to_int_type(const char_type& __c)
static bool eq_int_type(const int_type& __c1, const int_type& __c2)
// char_type單字元比較操作
static bool eq(const _chart& __c1, const _chart& __c2)
static bool lt(const _chart& __c1, const _chart& __c2)
// char_type字串行s[n]的比較操作
static int compare(const _chart* __s1, const _chart* __s2, size_t __n)
static size_t length(const _chart* __s)
return __i;
} static const _chart* find(const _chart* __s, size_t __n, const _chart& __c)
// 使用標準c庫的memmove和memcpy提高了效率
static _chart* move(_chart* __s1, const _chart* __s2, size_t __n)
static _chart* copy(_chart* __s1, const _chart* __s2, size_t __n)
static _chart* assign(_chart* __s, size_t __n, _chart __c)
// i/o相關操作
#ifdef __stl_use_new_iostreams
typedef streamoff off_type; // 流中的偏移量
typedef streampos pos_type; // 流中位置
typedef mbstate_t state_type; // 多位元組流狀態
#endif /* __stl_use_new_iostreams */
static int_type eof()
static int_type not_eof(const int_type& __c)
};// generic char_traits class. note that this class is provided only
// as a base for explicit specialization; it is unlikely to be useful
// as is for any particular user-defined type. in particular, it
// *will not work* for a non-pod type.
template class char_traits
: public __char_traits_base<_chart, _chart>
{};
從sgi標準庫的**中可以看出:通用的char_traits本身沒有任何屬性(除了一些字元之間的操作和型別定義),只有針對特定字元型別的專門char_traits具有屬性。
任何乙個類想要作為basic_string的字元型別,必須支援上述功能的專門化的char_traits。
下面我們分析針對char型別的特化版本:
// specialization for char.
__stl_template_null class char_traits: public __char_traits_base
static int_type to_int_type(const char_type& __c)
// 使用mencmp提高效率
static int compare(const char* __s1, const char* __s2, size_t __n)
static size_t length(const char* __s)
static void assign(char& __c1, const char& __c2)
// 使用menset提高效率
static char* assign(char* __s, size_t __n, char __c)
};
寬字元很像char,除了它占用兩個或者多個位元組之外。wchar_t通常用於儲存16位字符集,如unicode。
// specialization for wchar_t.
__stl_template_null class char_traits: public __char_traits_base{};
基礎串類basic_string
basic_string很像vector,但是不會直接用陣列或者vector實現,為了支援string的許多常見應用,實現中需要儘量減少複製,對短的字串不適用自由儲存空間,允許對長串簡單修改等。首先,basic_string總是在字元末尾儲存乙個null字元,這有助於執行c_str操作;其次,標準庫定義了一些basic_string特有的操作,比如:char_traits<>::assign, char_traits<>::copy和char_traits<>::move;最後,雖然basic_string增加了一些很方便的介面,但嚴格上將是多餘的。
雖然c++標準強加了乙個限制:_chart必須是乙個pod型別,但是sgi的實現弱化了限制,只要_chart有個預設建構函式就行。
basic_string和其它標準庫容器一樣,首先是型別的定義:
template class basic_string : private _string_base<_chart,_alloc> ;
只要_chart提供與char相同的語義,相應的串就可以像char的串一樣使用。
與其他容器一樣,乙個string也提供了常規額和反向的迭代器:
template class basic_string : private _string_base<_chart,_alloc>
iterator end()
const_iterator begin() const
const_iterator end() const
reverse_iterator rbegin()
reverse_iterator rend()
const_reverse_iterator rbegin() const
const_reverse_iterator rend() const
};
標準庫String型別
1 string物件的讀寫 用iostream標準庫可以用於讀寫內建型別如int double等的值,同樣也可以用iostream和string標準庫,使用輸入輸出操作符來讀寫string物件 注 從標準輸入讀取string,並將讀入的串儲存在s中。string型別的輸入操作符 另外還有乙個有用的s...
標準庫 string 型別
從標準輸入讀取 string 並將讀入的串儲存在 s 中。string 型別的輸入操作符 讀取並忽略開頭所有的空白字元 如空格,換行符,製表符 讀取字元直至再次遇到空白字元,讀取終止。輸入 hello world 則螢幕上將輸出 hello 而不含任何空格。這個函式接受兩個引數 乙個輸入流物件和乙個...
標準庫型別string
include using namespace std string定義在命名空間std中文件 string標準庫 string是乙個內部定義的類,初始化類物件的方式是通過類內部定義的構造方法決定的。下面列出幾個string常用的初始化方式 string s1 預設的初始化方式,s1是乙個空串 st...