C++ STL主要組件之String總結(第一部分,構造和操作)

最近在學習C++時,進入到了STL的學習階段,在發現到這個部分的重要性時,我打算把對STL的學習分步驟記錄下來,我首先打算學習的是組件String的部分,此文章主要只記錄內部構造和對象基本操作。

STL是由C++提供的標準模板庫,內含多個主要組件,此次總結的是String部分的內容。String在STL中算是較爲重要的部分,所以需要我重點攻克。

先放一張我學習String後對於此部分知識點的概括。
C++ STL主要組件之String總結(第一部分,構造和操作)

首先是第一部分:

一.標準庫中的String類都有哪些內容

首先是String中包含的接口:
其實這一部分要理解還是不難的,因爲這些功能性的函數之前大都或多或少的編寫過。
1.構造函數
(1)無參構造函數
string()//構造空的string對象,一個空字符串
eg:

string s1;//構造空的String類對象s1

(2)帶參構造函數
此時常見構造函數就不止一種了
①參數爲c風格字符串
string(const char * s)
eg:

string s2(“hello”);//使用C風格字符串構造的String類對象

②構造的對象中包含n個字符c
string(size_t n,char c)
eg:

string s3(10,‘n’);//構造的對象爲字符串“nnnnnnnnnn”

③拷貝構造(使用相同類的對象來構造新的類對象)
string(const string& s)
eg:
string s4(s3);

2.String類對象對於容量的操作
這一部分其實要去全部學習其實是效率不高的,如下圖
C++ STL主要組件之String總結(第一部分,構造和操作)
(圖片來源cplusplus.com)
所以主要選取其中使用較爲頻繁的幾種(size,empty,clear,reserve,resize)來主要學習便可。
(1)size
size函數會返回當前對象的有效字符長度
eg:

string s;
cout << s.size();

(2)empty
empty會檢測當前字符串是否已釋放爲空串,是的話返回true,否的話返回false
eg:

string s;
if(s.empty()){
return 0;
}

(3)clear
clear會清空當前對象的有效字符,但不會改變底層空間大小
eg:

string s;
s.clear();

(4)resize( size_t n, char c )
resize會修改當前對象有效字符個數,多出的部分會使用字符c填充
若是修改後有效字符長度小於之前,則多出的部分將被截掉
eg:

string s;
s.resize(20,'w');


需要注意的點有:

<1>如果是將string類中的有效元素縮小,只改變有效元素個數,不會改變底層空間大小
<2>如果是將string類中的有效元素增多,可能需要擴容(改變底層空間大小)

(5)reserve( size_t newcapacity )
reserve會修改當前對象底層空間大小,但不會修改有效字符個數
當newcapacity > oldcapacity(string類舊空間大小)時,進行擴容
若是newcapacity < oldcapacity 時,函數直接返回,不作任何修改
eg:

string s;
reserve(20);

需要注意的點:
在不同環境下,reserve進行擴容的大小是不一樣的(當對象字符串長度小於15時,初始分配底層空間大小爲15):
例如:在vs平臺下擴容大小大約是原來的1.5倍
但是在linux下擴容大小就是原來的2倍

最後是容量操作中的小點:
size()與length()方法底層實現原理完全相同,引入size()的原因是爲了與其他容器的接口保持一致(函數返回值也完全相同)

3.對於string類對象的訪問方法
(1)對於指定位置的的訪問
在對象操作中,這樣的訪問通常使用operator[ ]來進行(類似於訪問數組元素的操作)
eg:

string s(“hello”);
cout << s[0];

輸出結果:
h
(2)使用遍歷方法訪問(或修改)
在C++中,此處我們一共可以使用3中遍歷方法(ps:I like it!O(∩_∩)O)
<1>使用for循環加operator[ ]的方式遍歷字符串
eg:

string s(“beat it”);
for(size_t i=0;i<=s.size();++i)
cout << s[ i ];

<2>使用迭代器的方法遍歷
注意:
①標準庫容器都可以使用迭代器
②begin()方法負責返回指向第一個元素的迭代器,end()方法負責返回指向容器尾元素的下一個位置的迭代器
③如果容器爲空,則begin和end返回的是同一個迭代器
④rbegin()返回一個逆向迭代器,指向字符串的最後一個字符,rend()函數返回一個逆向迭代器,指向第一個字符的前一個位置,具體位置爲下圖:
C++ STL主要組件之String總結(第一部分,構造和操作)
(圖片來源於網絡)

eg:

string::iterator it = s.begin();  
 while(it != s.end())
 {
 cout<<*it<<endl;
 ++it;       //指向元素位置移動如上圖
 }

 string::reverse_iterator rit = s.rbegin(); //此處爲反向迭代器的使用
 while(rit != s.rend())
 {
 cout<<*rit<<endl;
++rit;     //指向元素位置移動如上圖
}

<3>使用範圍for方法遍歷
eg:

for(auto c : s)
cout << c << endl;

4.對於string類對象的內容修改操作

string類中常用的此類操作有如下幾種:

  • push_back --在字符串後尾插字符c
    eg:
    string s1;
    s1.push_back('I');
  • append --在字符串後追加一個字符串(使用方法有很多種,如下圖)
    C++ STL主要組件之String總結(第一部分,構造和操作)
    eg:
    常用的兩種:
    s1.append("祖國");   //圖中第一種
    s1.append(3, '!');    //圖中第五種
  • operator+= -- 在字符串後追加字符串str
    eg:
    s1 += " Love ";
  • c_str --返回C格式字符串
  • find + npos --從字符串pos位置開始往後找字符c,返回該字符在字符串中的位置
    eg:

    size_t pos = s.find ( ' c ' ) ; 
    if ( pos != string : : npos )   
    {
        cout  <<  'c'  <<  " is in s" << pos << endl;
    }

    注意:
    find方法在字符串s中查找字符c,若是找到返回該字符在字符串中的位置,若是沒有找到則返回npos
    npos是string類定義的一個靜態成員變量,保證其值大於任何有效的下標的值,可看成一個整數-1

  • rfind 從字符串pos位置開始往前找字符c,返回該字符在字符串中的位置....(其他同find)
  • substr 在str中從pos位置開始,截取n個字符,然後將其返回
    eg:
    substr(pos,n);
    substr(pos); //截取從pos到字符串結尾

同樣只對其中較爲重要的幾種(operator+=、c_str、find+npos)進行重點記憶,其他幾種瞭解即可。

5.對於string類的非成員函數
此處只是說明作用:

  • operator+ 儘量少用,因爲傳值返回,導致深拷貝效率低
  • operator>> (重點) 輸入運算符重載
  • operator<< (重點) 輸出運算符重載
  • getline (重點) 獲取一行字符串
  • relational operators (重點) 大小比較

標明重點部分需要掌握使用,在在線OJ將會用到

以上就是關於String第一部分的總結,附上一張收尾圖:
C++ STL主要組件之String總結(第一部分,構造和操作)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章