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