STL標準模組庫:容器string模組

mf1crystal發表於2018-01-25

STL概述
基本概念:
STL(Standard Template Library,標準模板庫)是惠普實驗室開發的一系列軟體的統稱。現然主要出現在C++中,但在被引入C++之前該技術就已經存在了很長的一段時間。
STL的從廣義上講分為三類:algorithm(演算法)、container(容器)和iterator(迭代器),容器和演算法通過迭代器可以進行無縫地連線。幾乎所有的程式碼都採 用了模板類和模板函式的方式,這相比於傳統的由函式和類組成的庫來說提供了更好的程式碼重用機會。在C++標準中,STL被組織為下面的13個頭文 件:、、、、、、、、、、、 和。

使用STL的好處:
1)STL是C++的一部分,因此不用額外安裝什麼,它被內建在你的編譯器之內。
2)STL的一個重要特點是資料結構和演算法的分離。儘管這是個簡單的概念,但是這種分離確實使得STL變得非常通用。
例如,在STL的vector容器中,可以放入元素、基礎資料型別變數、元素的地址;
STL的sort()函式可以用來操作vector,list等容器。
3) 程式設計師可以不用思考STL具體的實現過程,只要能夠熟練使用STL就OK了。這樣他們就可以把精力放在程式開發的別的方面。
4) STL具有高可重用性,高效能,高移植性,跨平臺的優點。
高可重用性:STL中幾乎所有的程式碼都採用了模板類和模版函式的方式實現,這相比於傳統的由函式和類組成的庫來說提供了更好的程式碼重用機會。關於模板的知識,已經給大家介紹了。
高效能:如map可以高效地從十萬條記錄裡面查詢出指定的記錄,因為map是採用紅黑樹的變體實現的。(紅黑樹是平橫二叉樹的一種)
高移植性:如在專案A上用STL編寫的模組,可以直接移植到專案B上。
跨平臺:如用windows的Visual Studio編寫的程式碼可以在Mac OS的XCode上直接編譯。
5) 程式設計師可以不用思考STL具體的實現過程,只要能夠熟練使用STL就OK了。這樣他們就可以把精力放在程式開發的別的方面。
6) 瞭解到STL的這些好處,我們知道STL無疑是最值得C++程式設計師驕傲的一部分。每一個C++程式設計師都應該好好學習STL。只有能夠熟練使用STL的程式設計師,才是好的C++程式設計師。
7) 總之:招聘工作中,經常遇到C++程式設計師對STL不是非常瞭解。大多是有一個大致的映像,而對於在什麼情況下應該使用哪個容器和演算法都感到比較茫然。STL是C++程式設計師的一項不可或缺的基本技能,掌握它對提升C++程式設計大有裨益。

容器:
序列式容器(Sequence containers)
每個元素都有固定位置--取決於插入時機和地點,和元素值無關。
vector、deque、list
關聯式容器(Associated containers)
元素位置取決於特定的排序準則,和插入順序無關
set、multiset、map、multimap

迭代器:
迭代器從作用上來說是最基本的部分,可是理解起來比前兩者都要費力一些。軟體設計有一個基本原則,所有的問題都可以通過引進一個間接層來簡化, 這種簡化在STL中就是用迭代器來完成的。概括來說,迭代器在STL中用來將演算法和容器聯絡起來,起著一種黏和劑的作用。幾乎STL提供的所有演算法都是通 過迭代器存取元素序列進行工作的,每一個容器都定義了其本身所專有的迭代器,用以存取容器中的元素。
  迭代器部分主要由標頭檔案,和組 成。是一個很小的標頭檔案,它包括了貫穿使用在STL中的幾個模板的宣告,中提供了迭代器 使用的許多方法,而對於的描述則十分的困難,它以不同尋常的方式為容器中的元素分配儲存空間,同時也為某些演算法執行期間產生 的臨時物件提供機制,中的主要部分是模板類allocator,它負責產生所有容器中的預設分配器。

演算法:
演算法部分主要由標頭檔案,和組 成。是所有STL標頭檔案中最大的一個(儘管它很好理解),它是由一大堆模版函式組成的,可以認為每個函式在很大程度上 都是獨立的,其中常用到的功能範圍涉及到比較、交換、查詢、遍歷操作、複製、修改、移除、反轉、排序、合併等等。體積很 小,只包括幾個在序列上面進行簡單數學運算的模板函式,包括加法和乘法在序列上的一些操作。中則定義了一些模板類, 用以宣告函式物件。

容器
string:
string是STL的字串型別,通常用來表示字串。而在使用string之前,字串通常是用char*表示的。string與char*都可以用來表示字串,那麼二者有什麼區別呢。
string和char*的比較
string是一個類, char*是一個指向字元的指標。
string封裝了char*,管理這個字串,是一個char*型的容器。
string不用考慮記憶體釋放和越界。
string管理char*所分配的記憶體。每一次string的複製,取值都由string類負責維護,不用擔心複製越界和取值越界等。
string提供了一系列的字串操作函式(這個等下會詳講)
查詢find,拷貝copy,刪除erase,替換replace,插入insert

建構函式
預設建構函式:
string(); //構造一個空的字串string s1。
拷貝建構函式:
string(const string &str); //構造一個與str一樣的string。如string s1(s2)。
帶引數的建構函式
string(const char *s); // 用字串s初始化
string(int n,char c); // 用n個字元c初始化

string類的字元操作
string類的字元操作:
const char &operator[] (int n) const;
const char &at(int n) const;
char &operator[] (int n);
char &at(int n);
operator[]和at()均返回當前字串中第n個字元,但二者是有區別的。
主要區別在於at()在越界時會丟擲異常,[]在剛好越界時會返回(char)0,再繼續越界時,編譯器直接出錯。如果你的程式希望可以通過try,catch捕獲異常,建議採用at()。

string取得const cha*的操作
const char *c_str() const; //返回一個以’\0’結尾的字串的首地址

把string拷貝到char*指向的記憶體空間的操作:
int copy(char *s, int n, int pos=0) const;
把當前串中以pos開始的n個字元拷貝到以s為起始位置的字元陣列中,返回實際拷貝的數目。注意要保證s所指向的空間足夠大以容納當前字串,不然會越界。

string的長度
int length() const; //返回當前字串的長度。長度不包括字串結尾的’\0’。
bool empty() const; //當前字串是否為空

string的賦值
string &operator=(const string &s); //把字串s賦給當前的字串
string &assign(const char *s); //把字串s賦給當前的字串
string &assign(const char *s, int n); //把字串s的前n個字元賦給當前的字串
string &assign(const string &s); //把字串s賦給當前字串
string &assign(int n,char c); //用n個字元c賦給當前字串
string &assign(const string &s,int start, int n); //把字串s中從start開始的n個字元賦給當前字串

string的字串的l連線:
string &operator+=(const string &s); //把字串s連線到當前字串結尾
string &operator+=(const char *s);//把字串s連線到當前字串結尾
string &append(const char *s); //把字串s連線到當前字串結尾
string &append(const char *s,int n); //把字串s的前n個字元連線到當前字串結尾
string &append(const string &s); //同operator+=()
string &append(const string &s,int pos, int n);//把字串s中從pos開始的n個字元連線到當前字串結尾
string &append(int n, char c); //在當前字串結尾新增n個字元c

string的比較
int compare(const string &s) const; //與字串s比較
int compare(const char *s) const; //與字串s比較
compare函式在>時返回 1,<時返回 -1,==時返回 0。比較區分大小寫,比較時參考字典順序,排越前面的越小。大寫的A比小寫的a小。

string的子串
string substr(int pos=0, int n=npos) const; //返回由pos開始的n個字元組成的子字串

string的查詢替換
查詢
int find(char c,int pos=0) const; //從pos開始查詢字元c在當前字串的位置
int find(const char *s, int pos=0) const; //從pos開始查詢字串s在當前字串的位置
int find(const string &s, int pos=0) const; //從pos開始查詢字串s在當前字串中的位置
find函式如果查詢不到,就返回-1
int rfind(char c, int pos=npos) const; //從pos開始從後向前查詢字元c在當前字串中的位置
int rfind(const char *s, int pos=npos) const;
int rfind(const string &s, int pos=npos) const;
//rfind是反向查詢的意思,如果查詢不到, 返回-1

string的區間刪除和插入
string &insert(int pos, const char *s);
string &insert(int pos, const string &s);
//前兩個函式在pos位置插入字串s
string &insert(int pos, int n, char c); //在pos位置 插入n個字元c

string &erase(int pos=0, int n=npos); //刪除pos開始的n個字元,返回修改後的字串

string的相關演算法
string s2 = “AAAbbb”;
transform(s2.begin(), s2.end(), s2.begin(), toupper);
cout << s2 << endl;

string s3 = "AAAbbb";
transform(s3.begin(), s3.end(), s3.begin(), tolower);
cout << s3 << endl;

相關文章