您好,登錄后才能下訂單哦!
今天就跟大家聊聊有關如何在C++中使用 STL 順序容器,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。
容器 | 數據結構 | 順序性 | 重復性 | 支持迭代器 |
---|---|---|---|---|
vector | 動態數組 | 無序 | 可重復 | 隨機訪問迭代器 |
deque | 雙向隊列 | 無序 | 可重復 | 隨機訪問迭代器 |
list | 雙向鏈表 | 無序 | 可重復 | 雙向迭代器 |
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 #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 #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 順序容器有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。