<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                [TOC] # 簡介 STL 從廣義上分為: 容器(container) 算法(algorithm) 迭代器(iterator),容器和算法之間通過迭代器進行無縫連接。STL 幾乎所有的代碼都采用了模板類或者模板函數,這相比傳統的由函數和類組成的庫來說提供了更好的代碼重用機會 # 六大組件 STL提供了六大組件,彼此之間可以組合套用,這六大組件分別是:容器、算法、迭代器、仿函數、適配器、空間配置器。 * **容器**: 各種數據結構,如vector、list、deque、set、map等,用來存放數據,從實現角度來看,STL容器是一種class template。 * **算法**: 各種常用的算法,如sort、find、copy、`for_each`。從實現的角度來看,STL算法是一種function tempalte. * **迭代器**: 扮演了容器與算法之間的膠合劑,共有五種類型,從實現角度來看,迭代器是一種將`operator* , operator-> , operator++,operator--`等指針相關操作予以重載的class template. 所有STL容器都附帶有自己專屬的迭代器,只有容器的設計者才知道如何遍歷自己的元素。原生指針(native pointer)也是一種迭代器。 * **仿函數**: 行為類似函數,可作為算法的某種策略。從實現角度來看,仿函數是一種重載了operator()的class 或者class template * **適配器**: 一種用來修飾容器或者仿函數或迭代器接口的東西。 * **空間配置器**: 負責空間的配置與管理。從實現角度看,配置器是一個實現了動態空間配置、空間管理、空間釋放的class tempalte. STL六大組件的交互關系,容器通過空間配置器取得數據存儲空間,算法通過迭代器存儲容器中的內容,仿函數可以協助算法完成不同的策略的變化,適配器可以修飾仿函數。 ## 迭代器 迭代器的種類: ![](https://img.kancloud.cn/f4/1c/f41ce2eb48fcc25074c572c748b37057_762x345.png) # 原理 ~~~ //數組容器 template<class T> class MyArray { public: //保護原生指針,給原生指針取別名 typedef T* iterator; MyArray() { mCapacity = 10; mSize = 10; p = new T[mCapacity]; for (int i = 0; i < mCapacity; i++) { p[i] = i + 1; } } //提供迭代器,開始位置的迭代器 T* begin() { return p; } //返回結束位置的迭代器 T* end() { return p + mSize; } public: T* p; int mCapacity; int mSize; }; //算法 template<class T> void printArray(T begin,T end) { for (; begin != end; ++begin) { cout << *begin << " "; } } void test01() { MyArray<int> arr; //獲取容器提供的開始位置迭代器 MyArray<int>::iterator begin=arr.begin(); //獲取容器提供的結束位置迭代器 MyArray<int>::iterator end = arr.end(); printArray(begin, end); } ~~~ # 簡單的helloworld ~~~ #define _CRT_SECURE_NO_WARNINGS #include<iostream> #include<vector>//容器 #include<algorithm>//算法的頭文件 #include<string> using namespace std; //加入算法的回調函數 void MyPrint(int val) { cout << val << " "; } //1.存儲基礎數據類型 void test01() { //容器 vector<int> v; v.push_back(10); v.push_back(20); v.push_back(30); v.push_back(40); v.push_back(50); //獲取開始位置的迭代器 vector<int>::iterator begin = v.begin(); //獲取結束位置的迭代器 vector<int>::iterator end = v.end(); /* void _For_each(_InIt _First, _InIt _Last, _Fn1& _Func) { for (; _First != _Last; ++_First) _Func(*_First); } */ //遍歷算法 for_each(begin, end, MyPrint); cout << endl; } //2.容器存儲對象 class Maker { public: Maker(string name, int age) { this->name = name; this->age = age; } public: string name; int age; }; ostream &operator<<(ostream &out, Maker &m) { out << "Name:" << m.name << " Age:" << m.age << endl; return out; } void test02() { vector<Maker> v; //往容器中存儲對象 v.push_back(Maker("悟空", 18)); v.push_back(Maker("小林", 19)); v.push_back(Maker("貝吉塔", 25)); v.push_back(Maker("龜仙人", 200)); v.push_back(Maker("短笛", 180)); //獲取開始和結束位置的迭代器 vector<Maker>::iterator begin = v.begin(); vector<Maker>::iterator end = v.end(); while (begin!=end) { cout << (*begin); begin++; } } //3.存儲對象的指針 void test03() { vector<Maker*> v; //創建數據 Maker *m1 = new Maker("悟空", 18); Maker *m2 = new Maker("小林", 19); Maker *m3 = new Maker("貝吉塔",200 ); Maker *m4 = new Maker("龜仙人",180 ); Maker *m5 = new Maker("短笛", 18); v.push_back(m1); v.push_back(m2); v.push_back(m3); v.push_back(m4); v.push_back(m5); vector<Maker*>::iterator begin = v.begin(); vector<Maker*>::iterator end = v.end(); while (begin!=end) { cout << (*begin)->name << " " << (*begin)->age << endl; ++begin; } delete m1; delete m2; delete m3; delete m4; delete m5; } //4.容器嵌套容器 void test04() { vector<vector<int>> vs; vector<int> v1; vector<int> v2; vector<int> v3; vector<int> v4; vector<int> v5; for (int i = 0; i < 5; i++) { v1.push_back(i + 10); v2.push_back(i + 10); v3.push_back(i + 10); v4.push_back(i + 10); v5.push_back(i + 10); } vs.push_back(v1); vs.push_back(v2); vs.push_back(v3); vs.push_back(v4); vs.push_back(v5); vector<vector<int>>::iterator begin = vs.begin(); vector<vector<int>>::iterator end = vs.end(); while (begin!=end) { vector<int>::iterator sbegin = (*begin).begin(); vector<int>::iterator send = (*begin).end(); while (sbegin!=send) { cout << *sbegin << " "; ++sbegin; } cout << endl; ++begin; } } int main() { test04(); system("pause"); return EXIT_SUCCESS; } ~~~
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看