程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> STL學習總結之容器

STL學習總結之容器

編輯:關於C++

STL介紹

STL(Standard Template Library,標准模板庫),是惠普實驗室開發的一系列軟件的統稱。現在主要出現在 c++中,但是在引入 c++之前該技術已經存在很長時間了。STL 從廣義上分為: 容器(container) 算法(algorithm) 迭代器(iterator),容器和算法之間通過迭代器進行無縫連接。STL 幾乎所有的代碼都采用了模板類或者模板函數,這相比傳統的由函數和類組成的庫來說提供了更好的代碼重用機會。

STL組成構件

簡單來說;
容器:類似數據結構,數組,鏈表,棧,隊列等等。
算法:一些算法方式,一些排序算法,提供任何數據類型。
迭代器:將算法和容器進行鏈接。

STL 優點:高可重用性,高性能,高移植性,跨平台。

vector

圖解:

這裡寫圖片描述

介紹

它是單端數組,只能對該數組的一端進行插入和刪除,他是一個動態數組,支持隨機訪問,存在自己的迭代器。

特點

vector 是動態數組,連續內存空間,具有隨機存取效率高的優點。
vector 是單口容器,在隊尾插入和刪除元素效率高,在指定位置插入會導致數據元素移動,效率低。

應用例子

#include
#include
#include
#include
using namespace std;
int main()
{
    vector v;
    //插入元素10
    for (int i = 0; i < 10;i++)
       v.push_back(i);

    //得到容器的迭代器
    vector::iterator it_begin = v.begin();
    vector::iterator it_end = v.end();

    //遍歷vector容器,將容器中的元素,輸出
    for (vector::iterator it=v.begin(); it != v.end(); it++)
    {
        cout << *it << endl;
    }

    vectorv1(v);
for (vector::iterator it = v1.begin(); it != v1.end(); it++)
    {
        cout << *it << endl;
    }
    cout << "v1.front():" << v1.front() << endl;
    cout << "v1.back():" << v1.back() << endl;
    cout << "v1[2]" << v1[2]<

dueque

圖解:

這裡寫圖片描述

介紹:

它可以理解為一個雙端數組,這個數組的兩端都可以插入和彈出,支持隨機訪問,有自己的迭代器。

特點

雙端插入和刪除元素效率較高.
指定位置插入也會導致數據元素移動,降低效率.
可隨機存取,效率高.

應用例子

#include
#include
#include
#include
using namespace std;
int main()
{
    deque q;
    q.push_front(3);
    q.push_back(5);
    q.push_front(11);
    for (deque::iterator it = q.begin(); it != q.end(); it++)
    {
        cout << *it << endl;

    }
    cout <<"queue.at(2)"<

stack

圖解:

這裡寫圖片描述

介紹:

stack 是一種先進後出(first in last out,FILO)的數據結構,它只有一個出口,stack 只允許在棧頂新增元素,移除元素,獲得頂端元素,但是除了頂端之外,其他地方不允許存取元素,只有棧頂元素可以被外界使用,也就是說 stack 不能遍歷,沒有迭代器。

特點

棧不能遍歷,不支持隨機存取,只能通過 top 從棧頂獲取和刪除元素

應用例子

#include
#include
#include
#include
using namespace std;

int main()
{
    stacks;
    s.push(12);
    s.push(15);
    s.push(55);
    cout << "s.size()" << s.size() << endl;
    while (!s.empty())
    {
        cout << s.top() << endl;
        s.pop();
    }
    cout << "s.size()" << s.size() << endl;
    return 0;
}

queque

圖解:

這裡寫圖片描述

介紹:

queue 是一種先進先出(first in first out, FIFO)的數據類型,他有兩個口,數據元素只能從一個口進,從另一個口出.隊列只允許從隊尾加入元素,隊頭刪除元素,必須符合先進先出的原則,queue 和 stack 一樣不具有遍歷行為。

特定

必須從一個口數據元素入隊,另一個口數據元素出隊。
不能隨機存取,不支持遍歷

應用例子

#include
#include
#include
#include
using namespace std;

int main()
{
    queue q;y
    q.push(3);
    q.push(6);
    q.push(9);
    while (!q.empty())
    {
        cout << q.front() << endl;
        q.pop();
    }
    return 0;
}

list

圖解:

這裡寫圖片描述

介紹:

鏈表是一種物理存儲單元上非連續、非順序的存儲結構,數據元素的邏輯順序是通過鏈表中的指針鏈接次序實現的。鏈表由一系列結點(鏈表中每一個元素稱為結點)組成,結點可以在運行時動態生成。每個結點包括兩個部分:一個是存儲數據元素的數據域,另一個是存儲下一個結點地址的指針域。

特點

采用動態存儲分配,最大化利用內存
鏈表執行插入和刪除操作十分方便,修改指針即可,不需要移動大量元素
鏈表靈活,但是空間和時間額外耗費較大

應用例子

#include
#include
#include
#include
using namespace std;

int main()
{
    list l;
    l.push_front(12);
    l.push_front(13);
    l.push_front(33);
    l.push_back(99);
    for (list::iterator it = l.begin(); it != l.end(); it++)
    {
        cout << *it << endl;
    }
    cout << "l.size(3)=" << l.size() << endl;
    cout << "l.front()=" << l.front() << endl;
    cout << "l.back()=" << l.back() << endl;
    return 0;
}

set

介紹:

借用平衡二叉樹的結構,來實現對數據的自動排序,set 容器中不允許重復元素,multiset 允許重復元素。

應用例子

#include
#include
#include
#include
using namespace std;
int main()
{
    set s;
    s.insert(11);
    s.insert(1);
    s.insert(22);
    s.insert(66);
    s.insert(88);
    for (set::iterator it = s.begin(); it != s.end(); it++)
    {
        cout << *it << endl;
    }
    set::iterator lo = s.lower_bound(22);//返回第一個 key>=keyElem 元素的迭代器。
    set::iterator up = s.upper_bound(22);//返回第一個 key>keyElem 元素的迭代器。
    pair::iterator ,set::iterator> equal =s.equal_range(22);//返回容器中 key 與 keyElem 相等的上下限的兩個迭代器。
    cout <<"*lo=" <<*lo << endl;
    cout << "*up=" << *up << endl;
    cout <<"*(equal.first)="<<*(equal.first) << endl;
    cout << "*(equal.second)=" << *(equal.second) << endl;
    return 0;
}

map

介紹:

map 相對於 set 區別,map 具有鍵值和實值,所有元素根據鍵值自動排序。pair 的第一元素被稱為鍵值,第二元素被稱為實值。map 也是以紅黑樹為底層實現機制。map 和 multimap 區別在於,map 不允許相同 key 值存在,multimap 則允許相同key 值存在。

應用例子

#include
#include
#include
using namespace std;

int main()
{
    map m;
    m.insert(make_pair(1,1));
    m.insert(make_pair(2,2));
    m.insert(make_pair(3,3));
    for (map::iterator it = m.begin(); it != m.end(); it++)
    {
        cout <<"it->first="<first<<" ";
        cout << "it->second" << it->second << endl;
    }
    return 0;
}
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved