如需轉載,請註明出處。
經常編一些程序,感覺STL很有用,所以本次着手翻譯一些文章,寫個STL教程,以後用的話好直接查詢。
一、容器
容器可以描述爲包含相同類型數據的對象。容器用於實現不同的數據結構,例如數組,列表,樹等。
以下是提供所有容器的詳細信息以及頭文件和與之關聯的迭代器類型的容器:
容器 | 描述 | 頭文件 | 迭代器 |
vector |
vector是一個創建動態數組的類,允許在後面插入和刪除。 | <vector> | 隨機訪問 |
list | list是允許從任何地方插入和刪除的序列容器。 | <list> | 雙向 |
deque | deque是雙端隊列,允許從兩端插入和刪除。 | <deque> | 隨機訪問 |
set | set是用於存儲唯一集的關聯容器。 | <set> | 雙向 |
multiset | Multiset是用於存儲非唯一集的關聯容器。 | <set> | 雙向 |
map | Map是用於存儲唯一鍵值對的關聯容器,即每個鍵僅與一個值(一對一映射)相關聯。 | <map> | 雙向 |
multimap | multimap是用於存儲鍵值對的關聯容器,每個鍵可以與多個值相關聯。 | <map> | 雙向 |
stack | 它遵循後進先出 | <stack> | 沒有迭代器 |
queue | 它遵循先進先出 | <queue> | 沒有迭代器 |
Priority-queue | 第一個元素總是最高優先級的元素。 | <queue> | 沒有迭代器 |
容器的分類:
- 序列容器
- 關聯容器
- 派生容器
注意:每個容器類都包含一組可用於操作內容的函數。
二.迭代器
- 迭代器是類似指針的實體,用於訪問容器中的各個元素。
- 迭代器從一個元素順序移動到另一個元素。此過程稱爲迭代容器。
迭代器主要包含兩個函數:
begin():成員函數begin()返回向量的第一個元素的迭代器。
end():成員函數end()返回一個迭代器到容器的最後一個元素。
三.迭代器的類別
迭代器主要分爲五類:
1.輸入迭代器:
- 輸入迭代器是一個迭代器,允許程序從容器中讀取值。
- 取消引用輸入迭代器允許我們從容器中讀取值,但它不會改變值。
- 輸入迭代器是單向迭代器。
- 輸入迭代器可以遞增,但不能遞減。
2.輸出迭代器:
- 輸出迭代器類似於輸入迭代器,除了它允許程序修改容器的值,但它不允許讀取它。
- 它是一個單向迭代器。
- 它是一個只寫迭代器。
3.前向迭代器:
- 前項迭代器使用++運算符在容器中導航。
- 前向迭代器一次遍歷容器的每個元素和一個元素。
4.雙向迭代器:
- 雙向迭代器類似於前向迭代器,此外它也向後移動。
- 它是一個雙向迭代器。
- 它可以遞增也可以遞減。
5.隨機訪問迭代器:
- 隨機訪問迭代器可用於訪問容器的隨機元素。
- 隨機訪問迭代器具有雙向迭代器的所有功能,並且還具有一個附加功能,即指針添加。通過使用指針添加操作,我們可以訪問容器的隨機元素。
迭代器支持的操作:
迭代器 | 元素訪問 | 讀 | 寫 | 增量操作 | 比較 |
輸入 | -> | v=*p | ++ | ==,!= | |
輸出 | *p=v | ++ | |||
前向 | -> | v=*p | *p=v | ++ | ==,!= |
雙向 | -> | v=*p | *p=v | ++,-- | ==,!= |
隨機訪問 | ->、[] | v=*p | *p=v | ++,--,+,-,+=,--= | ==,!=,<,>,<=,>= |
四.算法
算法是在各種容器中用於處理其內容的函數。
要記住的要點:
- 算法提供大約60個算法函數來執行復雜操作。
- 標準算法允許我們同時使用兩種不同類型的容器。
- 算法不是容器的成員函數,但它們是獨立的模板函數。
- 算法可以節省大量的時間和精力。
- 如果我們想要訪問STL算法,我們必須在程序中包含<algorithm>頭文件。
STL算法可分爲:
- 非突變算法:非突變算法是不改變容器對象的任何值的算法,也不改變它們出現的元素的順序。這些算法可用於所有容器對象,並且它們使用前向迭代器。
- 變異算法:變異算法是可用於改變容器值的算法。它們還可用於更改它們出現的元素的順序。
- 排序算法:排序算法是用於對容器中的元素進行排序的修改算法。
- 集合算法:集合算法也稱爲排序範圍算法。該算法用於在容器上執行某些功能,極大地提高了程序的效率。
- 關係算法:關係算法是用於處理數值數據的算法。它們主要用於對容器中的所有元素執行數學運算。
五.函數對象
函數對象是一個包含在類中的函數,因此它看起來像一個對象。函數對象通過使用面向對象的特徵(例如泛型編程)來擴展常規函數的特徵。因此,我們可以說函數對象是一個智能指針,它比普通函數有許多優點。
以下是函數對象相對於常規函數的優點:
- 函數對象可以具有成員函數以及成員屬性。
- 函數對象可以在使用之前初始化。
- 只有當簽名不同時,常規函數纔能有不同的類型。即使簽名相同,函數對象也可以具有不同的類型。
- 函數對象比常規函數更快。
函數對象也稱爲“仿函數”。函數對象是一個包含至少一個operator()函數定義的對象。這意味着如果我們聲明一個類的對象'd',其中定義了operator()函數,我們可以使用對象'd'作爲常規函數。
假設'd'是類的對象,operator()函數可以被調用爲:
d();
它是與下面相同:
d.operator() ();
讓我們看一個簡單的例子:
#include <iostream>
using namespace std;
class function_object
{
public:
int operator()(int a, int b)
{
return a+b;
}
};
int main()
{
function_object f;
int result = f(5,5);
cout<<"Addition of a and b is : "<<result;
return 0;
}
輸出:
Addition of a and b is : 10
在上面的例子中,'f'是function_object類的一個對象,它包含operator()函數的定義。因此,'f'可以用作調用operator()函數的普通函數。