C語言中的字符串
在C語言中,字符串是以'\0'結尾的一些字符的集合,C標準庫中提供了一系列str系列的庫函數,但這些庫函數與字符串是分離的,不符合面向對象的編程思想。
string類的大致介紹
1.string是表示字符串的字符串類
2.string類的接口與常規容器的接口基本相同,又添加了一些專門用來操作string的常規操作
3.string在底層實際是basic_string模板類的別名
? ? typedef basic_string <char,char_traits,allocator> string
4.不能操作多字節或者變長字符的序列
string類對象的常見構造
1.string()
????????構造空的string類對象,即空的字符串
2.string(const char*s)
????????用c-string來構造string類對象
3.string(size_t n, char c)
? ? ? ? string類對象中包含n個字符c
4.string(const string&s)
? ? ? ? 拷貝構造函數
string類對象的容量操作
1.size
? ? ? ? 返回字符串有效字符長度
2.length
? ? ? ? 返回字符串有效字符長度
3.capacity
? ? ? ? 返回空間總大小
4.empty
? ? ? ? 檢測字符串是否為空串,若是返回true,若不是返回false
5.clear
? ? ? ? 清空有效字符
6.reserve
? ? ? ? 為字符串預留空間
7.resize
? ? ? ? 將有效字符的個數改成n個,多出的空間用字符c填充
注意:
->size()與length()方法底層實現原理完全相同,引入size()的原因是為了與其他容器的接口保持一致,一般情況下基本都是用size()
->clear()只是將string中有效字符清空,不改變底層空間大小
->resize(size_t n)與resize(size_t n, char c)都是將字符串中有效個數改變到n個,不同的是,當字符個數增多時,resize(n)用0來填充多出的元素空間,resize(n,c)用字符c來填充多出的元素空間。
(resize在改變元素個數時,如果是將元素個數增多,可能會改變底層容量的大小,如果是將元素個數減少,底層空間總大小不變)
->reserve(size_t res_arg=0),為string預留空間,不改變有效元素個數,當reserve的參數小于string的底層空間總大小時,reserve不會改變容量大小
string類對象的訪問及遍歷操作
1.operator[]
? ? ? ? 返回pos位置的字符,const string類對象調用
2.begin,end
? ? ? ? begin獲取第一個字符的迭代器,end獲取最后一個字符下一個位置的迭代器
3.rebegin,rend
? ? ? ? rebegin獲取最后一個字符的迭代器,rend獲取第一個字符前一個位置的迭代器
string類對象的修改操作
1.push_back
? ? ? ? 在字符串后尾插字符c
2.append
? ? ? ? 在字符串后追加一個字符串
3.operator+=
? ? ? ? 在字符串后追加字符串str
4.c_str
? ? ? ? 返回c格式字符串
5.find+npos
? ? ? ? 從字符串pos位置開始往后找字符c,返回該字符在字符串中的位置
6.rfind
? ? ? ? 從字符串pos位置開始往前找字符c,返回該字符在字符串中的位置
7.substr
? ? ? ? 在str中從pos位置開始,截取n個字符,然后將其返回
注意:
->在string尾部追加字符時,s.push_back(c)/s.append(1,c)/s+='c' 三種的實現方式差不多,一般情況下string類的+=操作用的比較多,+=操作不僅可以連接單個字符,還可以連接字符串
->對string操作時,如果能夠預估到大概放多少字符,可以先通過reserve把空間預留好
string類非成員函數
1.operator+
? ? ? ? 盡量少用,因為傳值傳值返回,導致深拷貝效率低
2.operator>>
? ? ? ? 輸入運算符重載
3.operator<<
? ? ? ? 輸出運算符重載
4.getline
? ? ? ? 獲取一行字符串
5.relational operators
? ? ? ? 大小比較
vs與g++下string結果的說明
1.vs下string的結構
string總共占28個字節,內部結構稍微復雜一點,先是有一個聯合體,聯合體中用來定義字符串中的儲存空間
->當字符串長度小于16時,使用內部固定的字符數組來存放
->當字符串長度大于等于16時,從堆上開辟空間
有一個size_t 字段保存字符串長度,有一個size_t 字段保存從堆上開辟空間總的容量
還有一個指針做一些其他的事情
2.g++下string的結構
g++下,string是通過寫時拷貝實現的,string對象總共占4個字節,內部只包含了一個指針,該指針將來指向一塊空間,內部包含了如下字段
->空間總大小
->字符串有效長度
->引用計數