3.string類對象的訪問及遍歷操作
函數名稱 | 功能說明 |
---|---|
operator[] (重 點) | 返回pos位置的字符,const string類對象調用 |
begin+end | begin獲取第一個字符的迭代器 + end獲取最后一個字符下一個位置的迭代器 |
rbegin+rend | rbegin獲取最后一個字符的迭代器 + rend獲取第一個字符上一個位置的迭代器 |
范圍for | C++11支持更簡潔的范圍for的新遍歷方式 |
void test1()
{string s1 = "gxlgxlgxlgxlgxl";cout << s1[0] << s1[1] << s1[2] << endl;
}void test2()
{string s1 = "gxlgxlgxlgxlgxl";//string::iterator it = s1.begin();auto begin = s1.begin();auto end = s1.end();cout << *begin << endl;cout << *(end - 1) << endl;//end指向最后一個字符的下一個位置,這里減1取最后一個位置while (begin != end){cout << *begin << endl;++begin;}}
void test3()
{string s1 = "gxlgxlgxlgxlgxl";auto rbegin = s1.rbegin();auto rend = s1.rend();cout << *(rend - 1) << endl;//rend指向第一個字符的前一個位置,//但是在這個rend中我們想取第一個位置的字符要減1cout << *rbegin << endl;//rebegin指向最后一個字符while (rbegin != rend){cout << *rbegin << endl;++rbegin;}//輸出為從字符串從后往前訪問,即rbegin+1 是在從后往前走,//這也解釋為何訪問第一個位置要rend-1
}void test4()
{string s1 = "gxlgxlgxlgxlgxl";for (auto ch : s1){cout << ch << endl;}
}
int main()
{test1();test2();test3();test4();return 0;
}
4.string類對象的修改操作
函數名稱 | 功能說明 |
---|---|
push_back | 在字符串后尾插字符c |
append | 在字符串后追加一個字符串 |
operator+= (重 點) | 在字符串后追加字符串str |
c_str(重點) | 返回C格式字符串 |
?nd + npos(重 點) | 從字符串pos位置開始往后找字符c,返回該字符在字符串中的 位置 |
r?nd | 從字符串pos位置開始往前找字符c,返回該字符在字符串中的位置 |
substr | 在str中從pos位置開始,截取n個字符,然后將其返回 |
5.string類非成員函數
函數 | 功能說明 |
---|---|
operator>> (重點) | 輸入運算符重載 |
operator<< (重點) | 輸出運算符重載 |
getline (重點) | 獲取一行字符串 |
relational operators (重點) | 大小比較 |
operator+ | 盡量少用,因為傳值返回,導致深拷貝效率低 |
上面的幾個接口大家了解一下,下面的OJ題目中會有一些體現他們的使用。string類中還有一些其他的操作,這里不一一列舉,大家在需要用到時不明白了查文檔即可。
6.vs和g++下string結構的說明
注意:下述結構是在32位平臺下進行驗證,32位平臺下指針占4個字節。
vs下string的結構
string總共占28個字節,內部結構稍微復雜一點,先是有一個聯合體,聯合體用來定義 string中字符串的存儲空間:
當字符串長度小于16時,使用內部固定的字符數組來存放 。
當字符串長度大于等于16時,從堆上開辟空間。
union _Bxty
{ // storage for small buffer or pointer to larger onevalue_type _Buf[_BUF_SIZE];pointer _Ptr;char _Alias[_BUF_SIZE]; // to permit aliasing
} _Bx;
這種設計也是有一定道理的,大多數情況下字符串的長度都小于16,那string對象創建好之后,內部已經有了16個字符數組的固定空間,不需要通過堆創建,效率高。
其次:還有一個size_t字段保存字符串長度,一個size_t字段保存從堆上開辟空間總的容量
最后:還有一個指針做一些其他事情。
故總共占16+4+4+4=28個字節。
g++下string的結構
G++下,string是通過寫時拷貝實現的,string對象總共占4個字節,內部只包含了一個指針,該指針將來指向一塊堆空間,內部包含了如下字段:
1)空間總大小
2)字符串有效長度
3)引用計數
struct _Rep_base
{size_type _M_length;size_type _M_capacity;_Atomic_word _M_refcount;
};
指向堆空間的指針,用來存儲字符串。