亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何在C++中使用 STL 順序容器

發布時間:2021-05-12 16:33:02 來源:億速云 閱讀:138 作者:Leah 欄目:開發技術

今天就跟大家聊聊有關如何在C++中使用 STL 順序容器,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。

C++ 標準模板庫 STL 順序容器

容器數據結構順序性重復性支持迭代器
vector動態數組無序可重復隨機訪問迭代器
deque雙向隊列無序可重復隨機訪問迭代器
list雙向鏈表無序可重復雙向迭代器

動態數組 vector

vector #include <vector> 動態數組:其元素在內存中是連續存放的,隨機存取任何元素都可以在常數時間內完成,在該容器的尾部增刪元素也幾乎能夠在常數時間內完成具有較好的性能。

一個 vector 常用函數使用實例如下:

#include <iostream>
#include <vector>
using namespace std;
template<class T>
void printVector(T s, T e){
    for(;s != e; ++s){
        cout << *s << ' ';
    }
    cout << endl;
}

int main(){
    int a[5] = {1,2,3,4,5};
    vector<int> v(a,a+5);
    cout << "1)" << v.end() - v.begin() << endl;
    cout << "2)";
    printVector(v.begin(), v.end());
    v.insert(v.begin()+3, 100); // insert()函數插入元素
    cout << "3)";
    printVector(v.begin(), v.end());

    vector<int> v2(5,0);
    v2.insert(v2.begin()+2,v.begin(),v.end()); // insert() 函數數據塊插入  
    cout << "4)";
    printVector(v2.begin(), v2.end());   
    v.erase(v.begin()+3); // erase() 函數刪除元素 
    cout << "5)";
    printVector(v.begin(), v.end());
    v.erase(v.begin()+2,v.begin()+4); // erase() 函數刪除數據塊
    cout << "6)";
    printVector(v.begin(), v.end());
 
    return 0;
}

構造函數

函數函數描述
vector構造函數創建一個 vector,可以設定大小 nSize
vector(const vector&)拷貝構造函數,可以對區間內另一個數組的元素進行拷貝
operator=將新內容分配給容器,替換其當前內容,并相應地修改其大小
assign將新內容分配給 vector,替換其當前內容,并相應地修改其 size

 容量管理函數

函數函數描述
size返回容器中元素的數量
max_size返回容器可容納的最大元素數
resize調整容器的大小,使其包含 n(參數)個元素
capacity返回當前為 vector 分配的存儲空間(容量)的大小
empty返回 vector 是否為空
reserve請求 vector 容量至少足以包含 n(參數)個元素
shrink_to_fit要求容器減小其 capacity(容量)以適應其 size(元素數量)

 增刪函數

函數函數描述
push_back在容器的最后一個元素之后添加一個新元素
pop_back刪除容器中的最后一個元素,有效地將容器 size 減少一個
insert通過在指定位置的元素之前插入新元素來擴展該容器,通過插入元素的數量有效地增加容器大小
erase從 vector 中刪除單個元素(position)或一系列元素([first,last)),這有效地減少了被去除的元素的數量,從而破壞了容器的大小
clear從 vector 中刪除所有的元素(被銷毀),留下 size 為 0 的容器
emplace通過在 position(參數)位置處插入新元素 args(參數)來擴展容器
emplace_back在 vector 的末尾插入一個新的元素,緊跟在當前的最后一個元素之后

 索引函數

函數函數描述
operator[]返回容器中第 n(參數)個位置的元素的引用
at返回容器中第 n(參數)個位置的元素的引用
front返回對容器中第一個元素的引用
back返回對容器中最后一個元素的引用
data返回指向容器中第一個元素的指針

迭代器函數

函數函數描述
begin返回指向容器中第一個元素的迭代器
end返回指向容器中最后一個元素之后的理論元素的迭代器
rbegin返回指向容器中最后一個元素的反向迭代器
rend返回一個反向迭代器,指向中第一個元素之前的理論元素
cbegin返回指向容器中第一個元素的常量迭代器(const_iterator)
cend返回指向容器中最后一個元素之后的理論元素的常量迭代器(const_iterator)
crbegin返回指向容器中最后一個元素的常量反向迭代器(const_reverse_iterator)
crend返回指向容器中第一個元素之前的理論元素的常量反向迭代器(const_reverse_iterator)

用 vector 實現二維數組

#include <iostream>
#include <vector>
using namespace std;

int main(){
    vector<vector<int>> arr(3); // arr中有 3 個元素,每個元素都是 vector<int> 容器
    for(int i=0; i<arr.size(); ++i){
        for(int j=0; j<3; ++j){
            arr[i].push_back(j);
        }
    }
    for(int i=0; i<arr.size(); ++i){
        for(int j=0; j<3; ++j){
            cout << arr[i][j] << ' ';
        }
        cout << endl;
    }
    return 0;
}

雙向隊列 deque

deque #include <deque> 雙向隊列:其元素在內存中是連續存放的,隨機存取任何元素都可以在常數時間內完成,在該容器的兩端增刪元素也幾乎能夠在常數時間內完成具有較好的性能。

所有適用于 vector 的操作都適用于 deque,除此之外,deque 還有 push_front / pop_front 在最前端插入或刪除元素的操作,復雜的都是 O ( 1 ) O(1) O(1) 。

函數函數描述
deque構造函數
push_back在容器的末尾添加一個新元素
push_front在容器的開頭插入一個新元素
pop_back刪除容器中的最后一個元素,同時將容器大小減少一個
pop_front刪除容器中的第一個元素,同時將容器大小減少一個
emplace_front在容器的開頭插入一個新的元素
emplace_back在容器的末尾插入一個新的元素

雙向鏈表 list

list #include <list> 雙向鏈表:其元素在內存中是不連續存放的,不支持隨機存取,在該容器的任何位置增刪元素幾乎都能夠在常數時間內完成具有較好的性能。

list 除了具有所有順序容器都有的成員函數之外,還支持以下8個成員函數:


函數函數描述
push_front在容器的開頭插入一個新元素
pop_front刪除容器中的第一個元素
sort元素排序,值得注意的是 list 不支持 STL 算法中的 sort
remove刪除和指定值相等的所有元素
unique刪除所有和前一個元素相同的元素,使得元素不重復,使用之前需要sort
merge合并兩個鏈表,并清空被合并的那個鏈表
reverse顛倒鏈表內容
splice在指定位置前面插入另一鏈表中的一個或多個元素,并在該鏈表中刪除這些元素

一個 list 的成員函數使用實例如下:

#include <iostream>
#include <list>
#include <algorithm>
using namespace std;

class A{
    private:
        int n;
    public:
        A(int n_){n = n_;}
        friend bool operator<(const A & a1, const A & a2);
        friend bool operator==(const A & a1, const A & a2);
        friend ostream& operator<<(ostream & o, const A & a2);
};

bool operator<(const A & a1, const A & a2){
    return a1.n < a2.n;
}

bool operator==(const A & a1, const A & a2){
    return a1.n == a2.n;
}

ostream& operator<<(ostream & o, const A & a2){
    o << a2.n;
    return o;
}

template <class T>
void printList(T start, T end){
    for(;start != end; ++start){
        cout << *start << ',';
    }
    cout << endl;
}

int main(){
    list<A> lst1, lst2;
    lst1.push_back(1); lst1.push_back(3);
    lst1.push_back(2); lst1.push_back(4);
    lst1.push_back(2);
    lst2.push_back(10); lst2.push_back(50);
    lst2.push_back(30); lst2.push_back(30);  
    lst2.push_back(40); lst2.push_back(40); 
    lst2.push_back(30); lst2.push_back(20);
    cout << "1) ";
    printList(lst1.begin(),lst1.end());
    cout << "2) ";
    printList(lst2.begin(),lst2.end());
    lst2.sort(); // 調用 sort 成員函數進行 lst2 排序
    cout << "3) ";
    printList(lst2.begin(),lst2.end());
    lst2.unique(); // 刪除 lst2 中所有和前一個元素相等的元素
    cout << "4) ";
    printList(lst2.begin(),lst2.end());
    lst2.pop_front(); // 將 lst2 的第一個元素刪除
    cout << "5) ";
    printList(lst2.begin(),lst2.end());
    lst1.remove(2); // 刪除 lst1 中所有值為 2 的元素
    cout << "6) ";
    printList(lst1.begin(),lst1.end());
    lst2.merge(lst1); // 將 lst1 中的元素合并到 lst2 并將 lst1 清空
    cout << "7) ";
    printList(lst2.begin(),lst2.end());
    lst2.reverse(); // 顛倒 lst2
    cout << "8) ";
    printList(lst2.begin(),lst2.end());
    
    lst1.push_back(100); lst1.push_back(200); 
    lst1.push_back(300); lst1.push_back(400);
    cout<<"9) ";
    printList(lst1.begin(),lst1.end());
    // 找到列表中的指定元素
    list<A>::iterator p1,p2,p3;
    p1 = find(lst2.begin(),lst2.end(),4);
    p2 = find(lst1.begin(),lst1.end(),200);
    p3 = find(lst1.begin(),lst1.end(),400);
    lst2.splice(p1,lst1,p2,p3); // 將 lst1 中 [p2,p3) 區間內的元素插入到 lst2 中 p1 位置之前,并將這些元素從 lst1 中刪除
    cout<<"10) ";
    printList(lst1.begin(),lst1.end());
    cout<<"11) ";
    printList(lst2.begin(),lst2.end());
    
    return 0;
}

看完上述內容,你們對如何在C++中使用 STL 順序容器有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

c++
AI

六枝特区| 北辰区| 宣化县| 岫岩| 邵阳县| 岑溪市| 莆田市| 昌江| 建阳市| 晋宁县| 土默特右旗| 英吉沙县| 抚顺县| 日照市| 陆河县| 高邑县| 灵丘县| 大同市| 巴林右旗| 公安县| 榆林市| 香格里拉县| 龙南县| 金湖县| 邹平县| 济南市| 巴彦淖尔市| 罗源县| 房山区| 自贡市| 金坛市| 同江市| 青龙| 千阳县| 缙云县| 靖安县| 台南县| 武汉市| 定西市| 绥棱县| 滕州市|