c++概念字符串操作
一、char_traits 字符特征類
1)意義:包裝特定串元素的通用行為界面,以便容器實現時依據特征信息而執行特定行為
2)定義了通用類型名
typedef _Elem char_type;
typedef int int_type;
typedef streampos pos_type;
typedef streamoff off_type;
typedef mbstate_t state_type;
其中 int_type 表示字符元素轉換到特定編碼時的整型表示,pos_type, off_type 分別作為字符串索引和字符串元素偏移的類型,類似容器迭中的指針,迭代類型和指針,迭代器的偏移類型。最后的 state_type 用于存儲流狀態,如出錯,格式控制等等。
3)定義了字符 / 字符串操作的包裝界面,以便通用算法的調用
assign(a, b) 定義將 b 字符賦值給 a 字符的過程,實現 a.operator = 的行為
eq(a, b) 定義 a 字符和 b 字符的相等關系,實現 a.operator == 的行為
lt(a, b) 定義 a 小于 b 的關系,實現 a.operator 《 的行為
compare(a_ptr, b_ptr, cnt) 定義兩組字符串的比較,返回 int 類型,實現類似 memcmp 的行為
length(ptr) 定義取字符串長度,實現類似 strlen 的行為
copy(a_ptr, b_ptr, cnt) 定義兩組字符串的復制,實現類似 memcpy 的行為
move(a_ptr, b_ptr, cnt) 定義兩組字符串的不重疊復制,實現類似 memmove 的行為
assign(ptr, cnt, ch) 定義了填充字符串的過程,實現類似 memset 的行為
to_int_type(ch) 定義了 char_type 到 int_type 整型的轉換過程
to_char_type(n) 定義了 int_type 到 char_type 字符型的轉換過程
eq_int_type(a, b) 定義兩個和當前 char_type 類型對應的 int_type 的相等關系
eof() 定義字符串結尾符,使用整型表示
not_eof(n) 定義非字符串結尾符,若輸入結尾符,則返回 1,其他輸入返回原值,即總是不返回 eof()
4)int_type 類型應是當前字符類型的整型編碼
二、std::string 并不是序列容器,沒有 front() 和 back() 界面用于取出前端和尾端的元素,使用 std::string::operator [] 并傳遞 streampos 類型取得特定元素,如 std::string::size() - 1 作為索引取得最后一個字符
三、basic_string 支持的初始化
1)默認初始化
2)分配器
3)復制構造
4)局部復制 [_Roff, _Roff + _Count)
5)局部復制 + 分配器
6)C 字符串 [_Ptr, 《null》)
7)C 字符串 + _Count [_Ptr, _Ptr + _Count)
8)C 字符串 + 分配器
9)C 字符串 + _Count + 分配器 [_Ptr, _Ptr + _Count)
10)_Count * _Ch
11)_Count * _Ch + 分配器
12)迭代器 [_ItF, _ItL)
13)迭代器 + 分配器
字符到串不能初始化,但支持 operator = 賦值和 operator += 累加賦值運算。
四、字符串的區間有效性
對串的索引訪問在超過字符串的有效區間時,因為串的在實現上對內置的字符緩沖區執行下標訪問,所以不會導致異常,但是將得到不可預知的結果,通常是不可用的。
將其他字符串作為右值輸入時,對該串取出計數大于串大小時按串大小計算。
std::basic_string::size_type 的實際類型為 size_t,在 Visual C++ 7.1 中實現為 unsigned,std::basic_string::npos 被靜態設定為
(basic_string《_Elem, _Traits, _Alloc》::size_type)(-1);
在查找子字符串等操作時,函數返回 npos 的值表示非法索引。
五、比較字符串
允許的比較對象
1)compare(s2) 其他同類型字符串
2)compare(p) C 風格字符串
3)compare(off, cnt, s2) [off, off + cnt) 同 s2 執行比較
4)compare(off, cnt, s2, off2, cnt2) [off, off + cnt) 同 s2 [off2, cnt2) 執行比較
5)compare(off, cnt, p) [off, off + cnt) 同 [p , 《null》) 執行比較
6)compare(off, cnt, p, cnt2) [off, off + cnt) 同 [p, p + cnt2) 執行比較
返回 -1, 0, 1 作為小于、等于和大于的比較結果。
六、附加數據
1)使用 operator += 接受其他字符串,C 風格字符串和字符
2)使用 push_back() 在尾部附加字符,并使得通過字符串構造的 back_iterator 可以訪問
3)append() 附加
1、append(s) 追加字符串
2、append(s, off, cnt) 追加字符串 s [off, off + cnt)
3、append(p) 追加字符串 [p, 《null》)
4、append(p, cnt) 追加字符串 [p, p + cnt)
5、append(n, c) 填充 n * c
6、append(InF, InL) 追加輸入流 [InF, InL)
4)insert() 插入
1、insert(off, s2) 插入字符串
2、insert(off, s2, off2, cnt2) 插入字符串 s [off2, off2 + cnt2)
3、insert(off, p) 插入字符串 [p, 《null》)
4、insert(off, p, cnt) 插入字符串 [p, p + cnt)
5、insert(off, n, c) 插入 n * c
6、insert(iter) 元素默認值填充
7、insert(iter, c) 插入特定元素
8、insert(iter, n, c) 插入 n*c
9、insert(iter, InF, InL) 插入 [InF, InL)
5)operator +(a, b)
字符串關聯運算符重載中支持 operator + 的形式
1、s + s
2、s + p
3、s + c
4、p + s
5、c + s
七、查找、替換和清除
1)find() 查找
1、find(c, off) 在 s [off, npos) 中查找 c
2、find(p, off, n) 在 s [off, npos) 中查找 [p, p + n)
3、find(p, off) 在 s [off, npos) 中查找 [p, 《null》)
4、find(s2, off) 在 s [off, npos) 中查找 s2
2)find() 的變種
1、rfind() 具有 find() 的輸入形式,反序查找
2、find_first_of() 具有 find() 的輸入形式,返回第一個匹配的索引
3、find_last_of() 具有 find() 的輸入形式,返回倒數第一個匹配的索引
4、find_first_not_of() 具有 find() 的輸入形式,返回第一個不匹配的索引
5、find_last_not_of() 具有 find() 的輸入形式,返回倒數第一個不匹配的索引
3)replace() 替換
1、replace(off, cnt, s2) 將 s [off, off + cnt) 替換成 s2
2、replace(off, cnt, s2, off2, cnt2) 將 s [off, off + cnt) 替換成 s2 [off2, off2 + cnt2)
3、replace(off, cnt, p) 將 s [off, off + cnt) 替換成 [p, 《null》)
4、replace(off, cnt, p, cnt2) 將 s [off, off + cnt) 替換成 [p, p + cnt2)
5、replace(off, cnt, n, c) 將 s [off, off + cnt) 替換成 c * n
使用迭代器的情況:
6、replace(InF, InL, s2) 將 [InF, InL) 替換成 s2
7、replace(InF, InL, p) 將 [InF, InL) 替換成 [p, 《null》)
8、replace(InF, InL, p, cnt) 將 [InF, InL) 替換成 [p, p + cnt)
9、replace(InF, InL, n, c) 將 [InF, InL) 替換成 n * c
10、replace(InF, InL, InF2, InL2) 將 [InF, InL) 替換成 [InF2, InL2)
4)erase() 刪除
1、erase(off, cnt) 從字符串 s 中刪除 s [off, off + cnt)
2、erase(iter) 從字符串 s 中刪除 *iter
3、erase(ItF, ItL) 從字符串 s 中刪除 [ItF, ItL)
八、取出字符串
1)取得 C 風格字符串
c_str() 返回常量類型的 C 風格字符串指針,copy(ptr, cnt, off = 0) 則將指定大小的字符串復制到特定指針。data() 在 Visual C++ 7.1 中僅僅調用了 c_str() 實現。
2)取得子字符串
substr(off, cnt) 取得 s [off, off + cnt) 的副本。
3)復制子字符串
copy(p, off, cnt) 將 s [off, off + cnt) 復制到 p。
九、字符串的緩沖區管理
字符串具有類似 std::vector 的緩沖區管理界面。
size() 取得有效元素長度
max_size() 取得當前內存分配器能分配的有效空間
reserve() 為緩沖區預留空間
capacity() 取得緩沖區的容量
resize() 重設串的長度,可以為其指定初始化值
十、定義輸入迭代器的尾端
向 istream_iterator 傳遞輸入流對象以創建輸入迭代器,輸入迭代器持有輸入流對象的指針,默認創建和讀取流失敗的情況下該指針被設置為 0。并且在實現輸入迭代器間的 operator == 相等運算時,進行持有的流對象指針的相等比較,這樣,默認創建的輸入迭代器將被用于匹配輸入流的結束。
* 當輸入流讀取失敗,用戶執行 if, while 條件判斷時,實際上先將判斷值轉換成 void* 類型,或者根據 operator ! 運算符的返回結果,對輸入流重載 operator void* 和 operator ! 運算符,可以定義輸入流在布爾表達式中的行為,使得當流讀取失敗的情況下,輸入迭代器可以通過布爾表達式來確認,而不是顯式訪問 fail() 成員函數。
評論