日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

标准模板库STL学习总结

發布時間:2023/12/2 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 标准模板库STL学习总结 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
標準模板庫就是類與函數模板的大集合。STL共有6種組件:容器,容器適配器,迭代器,算法,函數對象和函數適配器。

1、容器:

容器是用來存儲和組織其他對象的對象。STL容器類的模板在標準頭文件中定義。主要如下所示

①序列容器

基本的序列容器是上面圖中的前三類:


關于三者的優缺點主要是:

A:vector<T>矢量容器:可以隨機訪問容器的內容,在序列末尾添加或刪除對象,但是因為是從尾部刪除,過程非常慢,因為必須移動插入或刪除點后面的所有對象。


矢量容器的操作:(自己以前有個表,貼出來大家看看)


其中的capacity表示容量,size是當前數據個數。矢量容器如果用戶添加一個元素時容量已滿,那么就增加當前容量的一半的內存,比如現在是500了,用戶添加進第501個,那么他會再開拓250個,總共就750個了。所以矢量容器當你添加數據量很大的時候,需要注意這一點哦。。。


如果想用迭代器訪問元素是比較簡單的,使用迭代器輸出元素的循環類似如下:

[cpp]?view plaincopy
  • vector<int>::iterator表示矢量容器vector<int>的迭代器。。。??
  • [cpp]?view plaincopy
  • for(vector<int>::iterator?iter?=?number.begin();?iter<number.end();?iter++)//這里的iterator?iter算是一個指針了??
  • ?????cout?<<?"?"?<<?*iter;??
  • 當然也可以用我們自己的方法,但是感覺用上面的更好一些。

    [cpp]?view plaincopy
  • for(vector<int>::size_type?i=0;?i<number.size();?i++)??
  • ????cout?<<?"?"?<<?number[i]??


  • 排序矢量元素:

    對矢量元素的排序可以使用<algorithm>頭文件中定義的sort()函數模板來對一個矢量容器進行排序。但是有幾點要求需要注意

  • sort()函數模板用<運算符來排列元素的順序,所以容器中對象必須可以進行<運算,如果是基本類型,可以直接調用sort(),如果是自定義對象,必須對<進行運算符重載
  • 兩個迭代器的指向必須是序列的第一個對象和最后一個對象的下一個位置。比如:sort(people.begin(), people.end());//這里兩個參數就是迭代器的意思了

  • B:deque<T>容器:非常類似vector<T>,且支持相同的操作,但是它還可以在序列開頭添加和刪除。


    deque<T>雙端隊列容器與矢量容器基本類似,具有相同的函數成員,但是有點不同的是它支持從兩端插入和刪除數據,所以就有了兩個函數:push_front和pop_front。并且有兩個迭代器變量

    [cpp]?view plaincopy
  • <span?style="font-size:18px;">#include?<deque>??
  • deque<int>?data;//創建雙端隊列容器對象??
  • deque<int>::iterator?iter;//書序迭代器??
  • deque<int>::reverse_iterator?riter;//逆序迭代器。??
  • //iter和riter是不同的類型</span>??

  • C:list<T>容器是雙向鏈表,因此可以有效的在任何位置添加和刪除。列表的缺點是不能隨機訪問內容,要想訪問內容必須在列表的內部從頭開始便利內容,或者從尾部開始。




    ②關聯容器

    map<K, T>映射容器:K表示鍵,T表示對象,根據特定的鍵映射到對象,可以進行快速的檢索。

    有關它的創建以及查找的操作作如下總結

    [cpp]?view plaincopy
  • //創建映射容器??
  • map<person,?string>?phonebook;??
  • ??
  • //創建要存儲的對象??
  • pair<person,?string>?entry?=?pair<person,?string>(person("mel",?"Gibson"),?"213?345?567");??
  • ??
  • //插入對象??
  • phonebook.insert(entry);//只要映射中沒有相同的鍵,就可以插入entry??
  • ??
  • //訪問對象??
  • string?number?=?phonebook[person("mel",?"Gibson")];//如果這個鍵不存在,會默認將這個鍵插入??
  • ??
  • //如果不想在找不到的時候插入,可以先查找然后再檢索??
  • person?key?=?person("mel",?"Gibson");??
  • map<person,?string>::iterator?iter?=?phonebook.find(key);//創建迭代器,就認為是指針就好了??
  • ??
  • if(iter?!=?phonebook.end())??
  • ????string??number?=?iter->second;??



  • 2、容器適配器:

    容器適配器是包裝了現有的STL容器類的模板類,提供了一個不同的、通常更有限制性的功能。具體如下所示


    A:queue<T>隊列容器:通過適配器實現先進先出的存儲機制。我們只能向隊列的末尾添加或從開頭刪除元素。push_back() pop_front()

    代碼:queue<string, list<string> > names;(這就是定義的一個適配器)是基于列表創建隊列的。適配器模板的第二個類型形參指定要使用的底層序列容器,主要的操作如下


    B:priority_queue<T>優先級隊列容器:是一個隊列,它的頂部總是具有最大或最高優先級。優先級隊列容器與隊列容器一個不同點是優先級隊列容器不能訪問隊列后端的元素。

    默認情況下,優先級隊列適配器類使用的是矢量容器vector<T>,當然可以選擇指定不同的序列容器作為基礎,并選擇一個備用函數對象來確定元素的優先級代碼如下

    [cpp]?view plaincopy
  • priority_queue<int,?deque<int>,?greate<int>>?numbers;??

  • C:stack<T>堆棧容器:其適配器模板在<stack>頭文件中定義,默認情況下基于deque<T>容器實現向下推棧,即后進先出機制。只能訪問最近剛剛進去的對象

    [cpp]?view plaincopy
  • <span?style="font-size:18px;">//定義容器??
  • stack<person>?people;??
  • //基于列表來定義堆棧??
  • stack<string,?list<string>>?names;</span>??

  • 基本操作如下:



    3、迭代器:

    具體它的意思還沒怎么看明白,書上介紹迭代器的行為與指針類似,這里做個標記,看看后面的例子再給出具體的解釋

    具體分為三個部分:輸入流迭代器、插入迭代器和輸出流迭代器。

    、

    看這一章的內容看的我有點抑郁了都,摘段課本介紹的內容,還是可以幫助理解的

    <iterator>頭文件中定義了迭代器的幾個模板:①流迭代器作為指向輸入或輸出流的指針,他們可以用來在流和任何使用迭代器或目的地之間傳輸數據。②插入迭代器可以將數據傳輸給一個基本序列容器。頭文件中定義了兩個流迭代器模板:istream_iterator<T>用于輸入流,ostream_iterator<T>用于輸出流。T表示從流中提取數據或寫到流中的對象的類型。頭文件還定義了三個插入模板:insert<T>, back_insert<T>和front_inset<T>。其中T也是指代序列容器中數據的類型。

    輸入流迭代器用下面的程序來說明下,可見具體注釋

    [cpp]?view plaincopy
  • #include?<iostream>????
  • #include?<vector>??
  • #include?<numeric>??
  • #include?<sstream>??
  • ??
  • using?namespace?std;????
  • ???
  • int?main()??
  • {??
  • ????//定義矢量容器??
  • ????vector<int>?numbers;??
  • ????cout?<<?"請輸入整數值,以字母結束:";??
  • ??
  • ????//定義輸入流迭代器。注意兩個不同??
  • ????//1、numberInput(cin)是指定迭代器指向流cin??
  • ????//2、numbersEnd沒有指定,是默認的,默認構造了一個end_of_stream的迭代器,它等價于調用end()??
  • ????istream_iterator<int>?numbersInput(cin),?numbersEnd;??
  • ??
  • ????//用戶輸入,直到輸入的不是int類型或者終止時結束。???
  • ????while(numbersInput?!=?numbersEnd)??
  • ????????numbers.push_back(*numbersInput++);??
  • ??
  • ????cout?<<?"打印輸出:"?<<?numbers.at(3)?<<?endl;??
  • ??
  • ??
  • ????//如何指定輸入流呢???
  • ??????
  • ????//確定字符串??
  • ????string?data("2.1?3.6?36.5?26?34?25?2.9?63.8");??
  • ??
  • ????//指定data為輸入流input。需要頭文件<sstream>??
  • ????istringstream?input(data);??
  • ??
  • ????//定義迭代器??
  • ????istream_iterator<double>?begin(input),?end;??
  • ??
  • ????//計算數值和。??
  • ????//acculumate為頭文件<numeric>下定義的函數。??
  • ????//第一個參數是開始迭代器,第二個是終止迭代器(最后一個值的下一個)。第三個是和的初值,注意必須用0.0,用它確定數據類型是double??
  • ????cout?<<?"打印數據的總和:"?<<?accumulate(begin,?end,?0.0)?<<?endl;??
  • }??
  • 輸出結果:

    耽誤時間太多。以后再寫吧

    4、算法:

    算法是操作迭代器提供的一組對象的STL函數模板,對對象的一個操作,可以與前面的容器迭代器結合起來看。如下圖介紹


    5、函數對象:

    函數對象是重載()運算符的類類型的對象。就是實現operator()()函數。

    函數對象模板在<functional>頭文件中定義,必要時我們也可以定義自己的函數對象。做個標記,等有具體實例來進行進一步的解釋。

    6、函數適配器:

    函數適配器是允許合并函數對象以產生一個更復雜的函數對象的函數模板。

    創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

    總結

    以上是生活随笔為你收集整理的标准模板库STL学习总结的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。