所以拋棄char*的字符串而選用C++標準程序庫中的string類,是因爲他和前者比較起來,不必 擔心內存是否足夠、字符串長度等等,而且作爲一個類出現,他集成的操作函數足以完成我們大多數情況下(甚至是100%)的需要。我們可以用 = 進行賦值操作,== 進行比較,+ 做串聯(是不是很簡單?)。我們儘可以把它看成是C++的基本數據類型。 首先,爲了在我們的程序中使用string類型,我們必須包含頭文件 <string>。如下: 1.聲明一個C++字符串 2.字符串操作函數 2.1 C++字符串和C字符串的轉換 2.2 大小和容量函數 還有必要再重複一下C++字符串和C字符串轉換的問 題,許多人會遇到這樣的問題,自己做的程序要調用別人的函數、類什麼的(比如數據庫連接函數Connect(char*,char*)),但別人的函數參 數用的是char*形式的,而我們知道,c_str()、data()返回的字符數組由該字符串擁有,所以是一種const char*,要想作爲上面提及的函數的參數,還必須拷貝到一個char*,而我們的原則是能不使用C字符串就不使用。那麼,這時候我們的處理方式是:如果 此函數對參數(也就是char*)的內容不修改的話,我們可以這樣Connect((char*)UserID.c_str(),
(char*)PassWD.c_str()),但是這時候是存在危險的,因爲這樣轉換後的字符串其實是可以修改的(有興趣地可以自己試一試),所以我強調除非函數調用的時候不對參數進行修改,否則必須拷貝到一個char*上去。當然,更穩妥的辦法是無論什麼情況都拷貝到一個char*上去。同時我們也祈 禱現在仍然使用C字符串進行編程的高手們(說他們是高手一點兒也不爲過,也許在我們還穿開襠褲的時候他們就開始編程了,哈哈…)寫的函數都比較規範,那樣 我們就不必進行強制轉換了。
我們可以使用下標操作符[]和函數at()對元素包含的字符進行訪問。但是應該注意的是操作符[]並不檢查索引是否有效(有效索引0~str.length()),如果索引失效,會引起未定義的行爲。而at()會檢查,如果使用 at()的時候索引無效,會拋出out_of_range異常。
Str[3]; //ok Str[100]; //未定義的行爲 Str[Str.length()] //未定義行爲 我不贊成類似於下面的引用或指針賦值: 2.4比較函數 s.compare("abcd"); //返回0 s.compare(s); //相等 2.5 更改內容 首先講賦值,第一個賦值方法當然是使用操作符=,新值可以是string(如:s=ns) 、c_string(如:s="gaint")甚至單一字符(如:s=’j’)。還可以使用成員函數assign(),這個成員函數可以使你更靈活的對字符串賦值。還是舉例說明吧:
s.append(str); s.append("my name is jiayp"); s.push_back(‘a’);//這個函數只能增加單個字符 對STL熟悉的理解起來很簡單 也許你需要在string中間的某個位置插入字符串,這時候你可以用insert()函數,這個函數需要你指定一個安插位置的索引,被插入的字符串將放在這個索引的後面。
2.6提取子串和字符串連接 2.7輸入輸出操作 2.8搜索與查找
一.標準C++庫字符串類std::string的用法 #include<string> std::string s1; std::string s3(s2); std::string s2("this is a string"); begin 得到指向字符串開頭的Iterator end 得到指向字符串結尾的Iterator rbegin 得到指向反向字符串開頭的Iterator rend 得到指向反向字符串結尾的Iterator size 得到字符串的大小 length() 和size函數功能相同 max_size 字符串可能的最大大小 capacity 在不重新分配內存的情況下,字符串可能的大小 empty 判斷是否爲空 operator[] 取第幾個元素,相當於數組 c_str 取得C風格的const char* 字符串 data 取得字符串內容地址 operator= 賦值操作符 reserve 預留空間 swap 交換函數 insert 插入字符 append 追加字符 push_back 追加字符 erase 刪除字符串 clear 清空字符容器中所有內容 resize 重新分配空間 assign 和賦值操作符一樣 replace 替代 copy 字符串到空間 find 查找,返回基於0的索引號 rfind 反向查找 find_first_of 查找包含子串中的任何字符,返回第一個位置 find_first_not_of 查找不包含子串中的任何字符,返回第一個位置 find_last_of 查找包含子串中的任何字符,返回最後一個位置 find_last_not_of 查找不包含子串中的任何字符,返回最後一個位置 substr(n1,len) 得到字符串從n1開始的長度爲len的子串 比較字符串(支持所有的關係運算符) compare 比較字符串 operator+ 字符串鏈接 operator+= += 操作符 operator== 判斷是否相等 operator!= 判斷是否不等於 operator< 判斷是否小於 operator>> 從輸入流中讀入字符串 operator<< 字符串寫入輸出流 getline 從輸入流中讀入一行 二.向量類模板std::vector成員函數: #include<vector> std::vector<type> name; std::vector<type> name(size); std::vector<type> name(size,value); std::vector<type> name(myvector); std::vector<type> name(first,last); assign(first,last) 用迭代器first,last所指定的元素取代向量元素 assign(num,val) 用val的num份副本取代向量元素 at(n) 等價於[]運算符,返回向量中位置n的元素 front() 返回向量中第一個元素的引用 back() 返回向量中最後一個元素的引用 begin() 返回向量中第一個元素的迭代器 end() 返回向量中最後一個元素的迭代器 max_size() 返回向量的最大容量(向量所能容納的最多元素個數) capacity() 返回向量當前所能容納的最多元素個數 clear() 刪除向量中所有元素 empty() 如果向量爲空,返回真 erase(start,end) 刪除迭代器start end所指定範圍內的元素 erase(i) 刪除迭代器i所指向的元素 insert(i,x) 把x插入到迭代器i所指定的位置 insert(i,n,x) 把x的n份副本插入到迭代器i所指定的位置 insert(i,start,end) 把迭代器start和end所指定的範圍內的值插入到迭代器i所指定的位置 push_back(x) 把x插入到向量的尾部 pop_back() 刪除向量中最後一個元素 rbegin() 返回一個反向迭代器,該迭代器指向的元素越過了向量中的最後一個元素 rend() 返回一個反向迭代器,該迭代器指向向量中第一個元素 reverse() 反轉元素順序 resize(n,x) 把向量的大小改爲n,新元素的初值賦爲x size() 返回向量的大小 swap(vectorref) 交換2個向量的內容 三.雙端隊列類模板std::deque成員函數: #include<deque> std::deque<type> name; std::deque<type> name(size); std::deque<type> name(size,value); std::deque<type> name(mydeque); std::deque<type> name(first,last); 其成員函數大部分和std::vector相同 PS: push_front(x)把x放到雙向隊列的頭部 pop_front() 把雙向隊列的第一個元素刪除
#include<list> std::list<type> name; std::list<type> name(size); std::list<type> name(size,value); std::list<type> name(mylist); std::list<type> name(first,last); 其成員函數大部分和std::vector相同 PS: push_front(x)把x放到鏈表頭部 pop_front() 把鏈表第一個元素刪除 merge(listref) 把listref所引用的鏈表中的所有元素插入到鏈表中 remove(val) 從鏈表中刪除所有值爲val的元素 remove_if(pred) 刪除鏈表中謂詞pred爲真的元素 (謂詞即爲元素存儲和檢索的描述,如std::less<>,std::greater<>那麼就按降序/升序排列,你也可以定義自己的謂詞) sort() 根據默認的謂詞對鏈表排序 sort(pred) 根據給定的謂詞對鏈表排序 unique() 刪除所有重複的元素,使鏈表中沒有重複元素 unique(pred) 根據謂詞pred刪除所有重複的元素,使鏈表中沒有重複元素 五.容器適配器堆棧類std::stack成員函數: #include<stack> stack實現先進後出的操作 std::stack<type,container> name; type爲堆棧操作的數據類型 container爲實現堆棧所用的容器類型,可以爲std::vector,std::deque,std::list 例如 std::stack<int,std::list<int>> IntStack; 管理成員函數只有:empty(),size(),top(),push(),pop() 六.容器適配器隊列類std::queue成員函數: #include<queue> queue實現先進先出的操作 std::queue<type,container> name; type爲隊列操作的數據類型 container爲實現隊列所用的容器類型,可以爲std::vector,std::deque,std::list 管理成員函數只有:empty(),size(),front(),back(),push(),pop() 七.關聯式容器: 集合類std::set, 多重集合類std::multiset, 映射類std::map, 多重映射類std::multimap, 位集合std::bitset 八.通用算法(對以上STL均適用) #include<algorithm> 1.非修正序列算法: 2.修正序列算法: 3.排序算法: 4.數值算法: 九.迭代器(類似指針的功能,對容器的內容進行訪問) #include<iterator> 例如: std::vector<int> IntVector; std::vector<int>::iterator first=IntVector.begin(); //first指向向量第一個元素,*first即爲第一個元素的值 std::vector<int>::iterator last=IntVector.end(); //end指向向量最後一個元素,*end即爲最後一個元素的值 |
標準類庫 STL C++(轉)
標準類庫 STL C++(轉)
2010-02-24 9:49
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.