STL是C++的一個重要組成部分。
我們使用C++的理由,無非3種:
- C++對C的兼容與擴展
- C++面向對象
C++ STL
在本系列blog中,我們就簡單的介紹一下STL的用法。
什麼是STL?
STL的全稱爲standard template library,標準模板庫。這個庫裏面有c++大牛封裝的一系列代碼。我們學習STL的目的不是分析STL源碼然後寫出跟STL中一樣性能強悍的代碼,而是學會使用STL已經集成好了的工具,去解決我們現實中所遇到的問題。研究STL源碼是專注於高性能C++代碼的工程師的工作,作爲初學者,熟練使用各種API,能夠解決LeetCode上的算法題,這就夠了。需要提一句,stl中所用容器算法都在命名空間std中。STL中有什麼?
STL可以分爲:容器(container),算法(algorithm)和迭代器(iterator)。當然STL中還有allocator,adapters和functors,我們遇到他們的時候再談論他們,我們先關注容器算法和迭代器。- 容器
我們可以把容器理解爲數據結構。容器的最主要的功能就是存儲數據。
容器分爲順序容器(序列式容器)和關聯式容器。
- 序列式容器:容器中元素的在容器中的存儲位置隨着元素進入容器的時間和地點而改變。
- vector
- deque
- stack
- queue
- list
- 關聯式容器:容器中元素在容器中的存儲位置跟元素進入容器的時間和地點無關。(基於二叉樹實現的)
- set
- multiset
- map
- multimap
- 序列式容器:容器中元素的在容器中的存儲位置隨着元素進入容器的時間和地點而改變。
迭代器
迭代器的功能和指針很像。迭代器是對指針的封裝。
迭代器最主要的功能是對容器中的數據進行遍歷。同時建立容器與算法之間的關係。
迭代器分爲:- 前向迭代器
- 雙向迭代器
- 隨機訪問迭代器
算法
算法是解決問題的方法。
這個之前說過很多次了,在這裏不重複了。
- 容器
在STL中容器和算法分離,那容器迭代器和算法是如何工作的呢?
容器中可以存放標準數據類型,對象和指針。以及容器(容器嵌套容器)。
寫個例子來說明容器可以存放標準數據類型,對象和指針:#include <iostream> #include <vector> #include <algorithm> using namespace std; void test_1(){ vector<int> v; v.push_back(10); v.push_back(20); v.push_back(30); vector<int>::iterator pStart = v.begin(); vector<int>::iterator pEnd = v.end(); while (pStart != pEnd){ cout << *pStart << endl; pStart++; } } class Teacher{ public: int id; int age; Teacher(int id, int age) :id(id), age(age){} }; void test_2(){ vector<Teacher> v; Teacher t1(1, 2), t2(3, 4), t3(5, 6); v.push_back(t1); v.push_back(t2); v.push_back(t3); vector<Teacher>::iterator pStart = v.begin(); while (pStart != v.end()){ cout << "ID:" << (*pStart).id << " Age:" << pStart->age << endl; pStart++; } } void test_3(){ vector<Teacher *> v; Teacher t1(11, 22), t2(33, 44), t3(55, 66); v.push_back(&t1); v.push_back(&t2); v.push_back(&t3); vector<Teacher *>::iterator Start = v.begin(); while (Start != v.end()){ Teacher * pStart = *Start; cout << "ID:" << (*pStart).id << " Age:" << pStart->age << endl; Start++; } } int main(){ test_1(); test_2(); test_3(); return 0; }