標準庫string原理與實現

2021-06-18 10:34:43 字數 3852 閱讀 7289

設計乙個完美的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...