標準庫中的string類
注意:
1. string是表示字符串的字符串類
2. 該類的接口與常規容器的接口基本相同,再添加了一些專門用來操作string的常規操作。 比特就業課
3. string在底層實際是:basic_string模板類的別名,typedef basic_string string;
4. 不能操作多字節或者變長字符的序列。 在使用string類時,必須包含#include頭文件(#include<string>)以及using namespace std;
a. string類對象的常見構造
代碼舉例1
#include <iostream>
#include<string>
using namespace std;
int main()
{string t1; // 相當于類對象的實例化
}
代碼舉例2
#include <iostream>
#include<string>
using namespace std;
int main()
{string t1("hello world"); // 調用構造函數cout << t1 << endl;string t2 = "hello world"; //隱式類型轉換(構造函數 + 拷貝構造 + 優化 -> 構造函數)cout << t2 << endl;
}
代碼舉例3
#include <iostream>
#include<string>
using namespace std;
int main()
{string t1(10, 'a'); // 拷貝 10 個 acout << t1 << endl;
}
運行結果:
代碼舉例4
#include <iostream>
#include<string>
using namespace std;
int main()
{string t1("hello");string t2(t1); // 拷貝構造cout << t2 << endl;
}
b. string類對象的容量操作
- size (返回字符串有效字符長度,沒有 '\0 ')
代碼舉例1
#include <iostream>
#include<string>
using namespace std;
int main()
{string t1 = "hello";cout << t1.size() << endl;
}
運行結果:
- capacity (返回字符串的總空間大小)
代碼舉例2
#include <iostream>
#include<string>
using namespace std;
int main()
{string t1 = "hello";cout << t1.capacity() << endl;
}
運行結果:
分析:
string 類里面的成員變量有兩個可以存儲空間,一個是數組,另一個是動態開辟的空間,當數組空間不足時,才會用動態開辟
- reserve(擴大字符串容量,字符有效長度不變:即 size 不變)
代碼舉例3
#include <iostream>
using namespace std;
int main()
{string t1 = "hello";cout << "有效長度:" << t1.size() << " 總容量:" << t1.capacity() << endl;t1.reserve(100);cout << "有效長度:" << t1.size() << " 總容量:" << t1.capacity() << endl;
}
運行結果:
分析:
有些編譯器在分配空間的時候,可能會對于開辟所需的空間再給大一點
- resize (將有效字符的個數該成n個,多出的空間用字符c填充)
代碼舉例4
#include <iostream>
using namespace std;
int main()
{string t1 = "hello";cout << "有效長度:" << t1.size() << " 總容量:" << t1.capacity() << endl;t1.resize(100);cout << "有效長度:" << t1.size() << " 總容量:" << t1.capacity() << endl;t1.resize(10); //可以縮小有效長度,但總容量不會隨意變動cout << "有效長度:" << t1.size() << " 總容量:" << t1.capacity() << endl;t1.resize(20, '*'); //對于的空間可以初始化任意字符cout << t1 << endl;
}
運行結果:
c. string類對象的訪問及遍歷操作
- operator[] (返回pos位置的字符,和 C 語言的用法一樣,const string類對象調用)
- begin + end (begin獲取一個字符的迭代器 + end獲取最后一個字符下一個位置的迭代器)
代碼舉例1
#include <iostream>
using namespace std;
int main()
{string t1 = "hello bit";string::iterator it = t1.begin();// it 相當于拿到 首元素的地址了while (it != t1.end()){cout << *it << endl;it++;}
}
運行結果:
分析:
- rbegin + rend (rbegin獲取最后一個字符的迭代器 + rend獲取第一個字符前一個位置的迭代器)
代碼舉例2
#include <iostream>
using namespace std;
int main()
{string t1 = "hello bit";string::reverse_iterator rit = t1.rbegin();// it 相當于拿到 首元素的地址了while (rit != t1.rend()){cout << *rit << endl;rit++;}
}
運行結果:
分析:
- 范圍for
代碼舉例3
#include <iostream>
using namespace std;
int main()
{string t1 = "hello bit";for (auto i : t1){cout << i;}cout << endl;for (int i = 0; i < t1.size(); i++){cout << t1[i];}
}
運行結果: