ACM總結——STL標準模板庫

STL標準模板庫是容器和算法組成的。

 

1,所有容器

(1)數組  array    向量 vector

(2)棧  stack

(3)隊列 queue     優先隊列 priority_queue     雙端隊列 deque

(4)鍵值對集合  map    multimap    unordered_map    unordered_multimap 

(5)集合 set   multiset   unordered_set    unordered_multiset  

(6)鏈表 list   forward_list

 

2,常用容器

(1)順序容器

鏈表 list     向量 vector    雙端隊列 deque

(2)關聯容器

set   multiset    unordered_set   

map   unordered_map   

(3)容器適配器

棧  stack   隊列 queue     優先隊列 priority_queue

 

3,容器主要用法

(1)順序容器

鏈表 list     向量 vector    雙端隊列 deque

(2)關聯容器

set   multiset    unordered_set   

map   unordered_map   

PS:contains是C++20的新函數

(3)容器適配器

棧  stack   隊列 queue     優先隊列 priority_queue

 

4,resize和reserve

    vector<int>v(3);
    cout<<v.size();
    v.reserve(5);
    cout<<v.size();
    v.resize(5);
    cout<<v.size();

輸出:3 3 5

這說明,reserve是預留空間,但是並不在容器中,而是在容器外,而resize是直接往容器中擴充了空間。

之所以要預留空間,是因爲vector是動態大小,如果插入次數較多,就會涉及到多次的整體搬運內存,效率變得很低。

 

5,sort函數

只有順序容器可以排序,關聯容器和容器適配器不能排序。

常用順序容器: 鏈表 list     向量 vector    雙端隊列 deque

鏈表排序是用成員sort函數,其他順序容器是用STL中sort函數,因爲鏈表是不連續的內存,其他順序容器是連續內存。

(1)STL中的sort函數

參考 C++中的 sort函數、函數指針、仿函數  https://blog.csdn.net/nameofcsdn/article/details/104823002

2個必選參數:begin和end,1個可選參數:比較函數

默認升序(相當於less<>()),也可以用函數指針,包括greater<>()、less<>()、自定義函數指針、自定義仿函數

(2)list的成員sort函數

1個可選參數:比較函數

默認升序(相當於less<>()),也可以用函數指針,包括greater<>()、less<>()、自定義函數指針,不能用自定義仿函數

(3)優先隊列priority_queue

優先隊列priority_queue、仿函數  https://blog.csdn.net/nameofcsdn/article/details/104831555

優先隊列在定義時需要內置比較函數,和list的成員sort函數一樣:

默認升序(相當於less<>()),也可以用函數指針,包括greater<>()、less<>()、自定義函數指針,不能用自定義仿函數

 

小結:所有排序都是默認是less函數,優先隊列是以end 作爲top,所以默認升序函數就是默認大頂堆。

 

6,find函數

順序容器採用STL中的find函數,而關聯容器採用成員find函數。

用法差不多,返回搜索結果的迭代器,搜索不到返回end,find使用的== 可以重載,即自定義查找條件。

(1)STL中的find函數

常用順序容器: 鏈表 list     向量 vector    雙端隊列 deque   

    list<int>l;
    l.push_back(1);
    auto it = find(l.begin(),l.end(),8);
    if(it==l.end())cout<<"not";
    else cout<<"yes";

雖然鏈表不是連續內存,但是迭代器可以++,基於此鏈表可以和連續內存一樣進行搜索。

(2)關聯容器的成員find函數

    set<int>s;
    s.insert(1);
    auto it = s.find(1);
    if(it==s.end())cout<<"not";
    else cout<<"yes";

PS:對於multi開頭的關聯容器,據說是返回第一個進入容器的那一個。

 

7,lower_bound、upper_bound、equal_range

//未完待續

 

8,copy函數

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章