????????我們繼續來講解一些常用的string接口。
? ? ? ? 一.at接口
????????
? ? ? ? 我們來看一個越界的問題。
? ? ? ? 我們運行之后發現這是一個斷言錯誤,直接就終止我們的程序了,不能作為異常被捕捉到,但是我們如果不想讓程序直接崩潰該怎么辦呢?
? ? ? ? 此時我們就要用到at關鍵字了。
????????at
?函數的重要特性是會進行邊界檢查。若傳入的索引超出字符串的有效范圍(即?pos >= str.size()
),它會拋出?std::out_of_range
?異常。
????????
? ? ? ?
? ? ? ? 此時程序不會直接崩潰而是拋出一個異常。
????????
二?push_back
? ? ? ? 這個就是添加元素的。
????????
? ? ? ? 此時s1就是x了。
? ? ? ? 這個沒什么講的,一次只能插入一個字符。
????????
三.append
? ? ? ? 這個就是添加字符串的,可以一次添加多個元素。
????????
? ? ? ? 就是把這個字符串給添加上去了。
????????
? ? ? ? 我們可以看到有六個用法,大家感興趣的都可以試試,我只講一些常用的吧。
????????
? ? ? ? 我們來看一下這個代碼,capacity和size的大小都是不帶/0的。
? ? ? ? 下面兩個就是常用的,可以通過迭代器的形式來給它值,最后一個append表示我們從s2的第六個開始,把后面都加上去,也就是wrold。
????????????????????????
? ? ??
? ? ? ? 這樣也是可以的,這是因為實現了運算符的重載。
????????
????????
四.思考? ? ?
? 下面我們來思考一下,size>capacity的時候,系統是怎么擴容呢?
? ? ? ? 我們來研究一下。
????????
? ? ? ? 我們運行一下看一下。
????????
? ? ? ? 我們發現是1.5倍左右(每個編譯器都是不同的),但是第一次擴容為什么會是兩倍呢?
????????因為我們可以認為是編譯器優化吧,vs如果你小于16的話,它是會有一個Buff數組來存放這些數據的,這樣會減少內存碎片,你要是超過這個大小才會擴容,第一次就是buff的二倍,以后才是原來的1.5倍數來擴容的。
? ? ? ? 我們用g++來演示一下。
????????
? ? ? ? 我們看到g++的擴容原則是兩倍兩倍的擴容。
????????
????????
五.reserve
? ? ? 這個接口的主要作用就是用來擴容的。
??????????
? ? ? ? 我們來看一下這個圖,當我們的預留空間小于size的時候。
? ? ? ? 要遵守這個原則,不能影響原來的內容,所以小于size的時候,一定不會縮容的,大于capacity一定是要擴容的,但是大于size小于capacity的時候就不一定縮容了,可能縮容也可能不縮容。
????????
????????
? ? ? ? 我們發現并沒有縮容的情況,我們再在g++上試一下。
????????
? ? ? ? 我們發現在g++上出現了縮容現象。
????????
六.resize
????????
? ? ? ? 這個的主要作用就是改變size 的大小的。
? ? ? ??
? ? ? ? 如果給的這個數小于size的大小就會刪除多余的數據,大于size小于capacity的話就會插入數據,不給第二個參數,如圖第二行就會用/0來補充,大于capacity的話就會擴容和插入數據。
????????
????????
七.insert
????????
? ? ? ? 我們來看一下,第一個insert,就是在0位置插入hello,我們要是只想插入一個char類型的單個字符怎么辦呢?
? ? ? ? 就是第二個insert,就是在0位置插入1個a,盡量還是不要用insert,因為它的時間復雜度是o(n),會使效率很低。
????????
????????
八.erase
???????????????
? ? ? ? 我們主要用第一個和第三個,第一個就是第二個erase,那個npos你可以理解為無窮大,不給值就會用缺省值,表示刪除第五個以后的元素,?第一個erase表示刪除第五個后面的兩個元素也就是第六個和第七個。
????????
九.結束語
?????????感謝大家的查看,希望可以幫助到大家,做的不是太好還請見諒,其中有什么不懂的可以留言詢問,我都會一一回答。? 感謝大家的一鍵三連。
? ? ??