STL用法點滴(不斷添加中)

來源:互聯網
上載者:User
 

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 已經包含了此索引值,那麼當前所關聯的值不會改變,   但可以累加"+="

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.