1、std::string的使用3、為什麼會出現大量的警告資訊4、multimap 模板類的用法5、map模板類的用法========================================================================================================= 1、
std::string的使用 注意:需加入標頭檔<string>,若加上using namespace std;就不必在string前加std std::string s1 = "Hello"; std::string s2 = "world"; std::string s3 = s1 + ", " + s2 + "!/n"; printf("%s/n",s3.c_str()); std::string name = "Niels Stroustrup"; std::string s = name.substr(6, 10); name.replace(0, 5, "Nicholas"); ========================================================================================================= 2、STL分為三大部分:演算法、容器和迭代器。三個部分是相互獨立的。 容器,比如vector,是類似數組的容器(vector在std命名空間內,所以要直接引用要加上using namespace std;) vector<int> v(3); // 定義一個有三個元素的數組,元素是int型(需要標頭檔<vector>) v[0] = 7; v[1] = v[0] + 3; v[2] = v[0] + v[1]; // 使用起來和一般的數組一樣 而該容器還可以裝其它類型的資料,如string vector<string> Tongue_Twister(3); Tongue_Twister[0] = "she" ; Tongue_Twister[1] = "sells" ; Tongue_Twister[2] = "sea" ; // 具有統一的賦值方式,不管其為什麼類型 由上面的例子看出容器和資料類型是獨立的,而演算法又和容器是互相獨立的 如std::reverse,該演算法用來實現元素的倒置(需標頭檔#include <algorithm>) std::reverse(v.begin(), v.end()); // 倒置int std::reverse(Tongue_Twister.begin(), Tongue_Twister.end()); // 倒置string 不管其操作的資料是什麼類型,使用的方式都是一樣的 即使是普通的數組,也可以用 double A[6] = { 1.2, 1.3, 1.4, 1.5, 1.6, 1.7 }; std::reverse(A, A + 6); 那麼reverse是參數是什麼,迭代器(如上,普通的指標也是一種迭代器) v.begin() 和 v.end() 返回的類型是 vector<int>::iterator Tongue_Twister.begin()返回的類型是 vector<string>::iterator 以下是如何遍曆容器內的元素 for(vector<int>::iterator it = v.begin(); it != v.end(); it++) { cout<<*it; int x = *it; *it = xx; // 迭代器使用起來如同指標 } // 要得到更多資訊,可用下面的關鍵詞去搜尋MSDN 演算法:reverse sort copy 容器: vector :該模板類描述一個由類型T元素組成的可變長隊列,該隊列儲存成一個T類列數組 list:該模板類描述一個由類型T元素組成的可變長隊列,該隊列儲存成一個T類列的雙向鏈表 (比較好的例子:http://www.vckbase.com/document/viewdoc/?id=781) map:一種關係式容器,可以根據關鍵字匹配多種數(下面是應用的一個例子) class CDivMap{public: typedef std::map<string, string> type_map; enum { NO_ELEMENT = 0 , VALUE_SAME = 1 , VALUE_NOSAME = 2 }; CDivMap(){} ~CDivMap() { if( !m_map.empty() ) m_map.clear(); } int Compare(char * strKey , char *strVal) { if( m_map.empty() ) { //m_map.insert( type_map::value_type( strKey , strVal ) ); 這兩種寫法都可以 m_map[strKey] = strVal; return NO_ELEMENT; } else { type_map::iterator it = m_map.find( strKey ); if( it == m_map.end() ) { // 未找到 //m_map.insert( type_map::value_type( strKey , strVal ) ); 這兩種寫法都可以 m_map[strKey] = strVal; return NO_ELEMENT; } else { if( lstrcmpA( it->second.c_str() , strVal ) == 0 ) return VALUE_SAME; else { it->second = strVal; return VALUE_NOSAME; } } } } int Count() const { return m_map.size(); } void print() { type_map::iterator it; for(it = m_map.begin();it!=m_map.end();++it) printf("%s %s/n",it->first.c_str(),it->second.c_str()); } protected: type_map m_map;}; ========================================================================================================= 3、
為什麼會出現大量的警告資訊編譯時間請加上/GX和/MT參數。前一個參數用於告知編譯器允許異常處理(Exception Handling)。在P. J. Plauger STL中的很多地方使用了異常處理機制(即try…throw…catch文法),所以應該加上這個參數,否則會有如下警告資訊:warning C4530: C++ exception handler used, but unwind semantics are not enabled.後一個參數則用於使程式支援多線程,它需要在連結時使用LIBCMT.LIB庫檔案。不過P. J. Plauger STL並不是安全執行緒的(thread safety)。如果你是在VC環境下使用像STLport這樣的STL實現版本,則需要加上這個參數,因為STLport是安全執行緒 有時,在IDE環境下編譯STL程式時,可能會出現如下警告資訊(前面那幾個樣本程式不會出現這種情況):warning C4786: '……' : identifier was truncated to '255' characters in the debug information 這是因為編譯器在Debug狀態下編譯時間,把程式中所出現的標識符長度限制在了255個字元範圍內。如果超過最大長度,這些標識符就無法在調試階段查看和計算了。而在STL程式中大量的用到了模板函數和模板類,編譯器在執行個體化這些內容時,展開之後所產生的標識符往往很長(沒準會有一千多個字元!)。如果你想認識一下這個warning的話,很簡單,在程式裡加上如下一行代碼:vector string_array; // 類似於字串陣列變數對於這樣的warning,當然可以置之不理,不過也是有解決辦法的。 你可以在檔案開頭加入下面這一行:#pragma warning(disable: 4786)。它強制編譯器忽略這個警告資訊,這種做法雖然有點粗魯,但是很有效。 ========================================================================================================4、
multimap 模板類的用法
參考:http://www.vckbase.com/document/viewdoc/?id=1398 multimap 容器,它與 map 類似,所不同的是它允許重複鍵。比如在電話簿中相同的人可以有兩個以上電話號碼
插入 multimap <string, string> phonebook; string name = "zheng"; string tel = "8226336"; phonebook.insert( make_pair(name , tel) ); // make_pair可以參考:http://www.vckbase.com/document/viewdoc/?id=1377的“Pair 和 Map”部分
尋找單個值 multimap<string,string>::iterator it = phonebool.find("zheng"); 返回第一個匹配的指標。當你想要檢查是否存在至少一個與該鍵關聯的值時,或者只需第一個匹配時,這個函數最有用
尋找關聯的所有值 typedef multimap <string, string>::const_iterator CIT; typedef pair<CIT, CIT> Range; Range range = phonebook.equal_range("zheng"); for(CIT i=range.first; i!=range.second; ++i) { printf("=%s/n",i->second.c_str()); }
返回與給定鍵關聯的值得數量 phonebook.count("zheng") upper_bound():lower_bound(k)的用法參考前面給出的URL! ======================================================================================================== 5、
map
模板類的用法
參考
:http://www.vckbase.com/document/viewdoc/?id=1377
賦值 map <string, string> addresses; addresses["zheng"]="paul@mail.com"; addresses["zheng"]="newaddr@com.net"; // 不起作用 ,注意,如果該 map 已經包含了此索引值,那麼當前所關聯的值不會改變, 但可以累加"+="