C++進階-2-STL初識
1 #include<iostream> 2 #include<string> 3 #include<vector> 4 #include<algorithm> 5 using namespace std; 6 7 // STL初識 8 9 // 示例1 10 // 容器:vector演算法 11 // 演算法:for_each 12 // 迭代器:vector<int>::iterator 13 14 void myPrint(int val) { 15 cout << val << endl; 16 } 17 18 // vector容器存放內置資料型別 19 void test01() { 20 21 // 創建vector容器,陣列 22 vector<int> v; 23 24 // 向容器插入資料(尾插) 25 v.push_back(10); 26 v.push_back(20); 27 v.push_back(30); 28 v.push_back(40); 29 30 31 // 通過迭代器訪問容器中的資料 32 vector<int>::iterator itBegin = v.begin(); // 起始迭代器 指向容器中第一個元素 33 vector<int>::iterator itEnd = v.end(); // 結束迭代器 指向容器中最后一個元素的下一個位置 34 35 // 第一種遍歷方式 36 while (itBegin != itEnd) 37 { 38 cout << *itBegin << endl; 39 itBegin++; 40 } 41 42 // 第二種遍歷方式(便捷) 43 for (vector<int>::iterator it = v.begin(); it != v.end(); it++) { 44 cout << *it << endl; 45 } 46 47 // 第三種遍歷方式(STL提供) 48 for_each(v.begin(), v.end(), myPrint); // 最后為函式名,回呼技術 49 50 } 51 52 53 54 // 示例2 55 // vector中存放自定義的資料型別 56 class Person { 57 public: 58 Person(string name, int age) { 59 this->m_Name = name; 60 this->m_Age = age; 61 } 62 63 string m_Name; 64 int m_Age; 65 66 }; 67 68 // 存放自定義的資料型別 69 void test02() { 70 vector<Person> v; 71 72 Person p1("aaa", 10); 73 Person p2("bbb", 20); 74 Person p3("ccc", 30); 75 Person p4("ddd", 40); 76 Person p5("eee", 50); 77 78 // 向容器中添加資料 79 v.push_back(p1); 80 v.push_back(p2); 81 v.push_back(p3); 82 v.push_back(p4); 83 v.push_back(p5); 84 85 // 遍歷容器中的資料 86 for (vector<Person>::iterator it = v.begin(); it != v.end(); it++) { 87 cout << "姓名:" << (*it).m_Name << " 年齡:" << (*it).m_Age << endl; 88 // it本質是個指標,也可以通過指標的當時拿到屬性 89 cout << "姓名:" << it->m_Name << " 年齡:" << it->m_Age << endl; 90 } 91 92 } 93 94 // 存放自定義資料型別 指標 95 void test03() { 96 vector<Person*> v; 97 98 Person p1("aaa", 10); 99 Person p2("bbb", 20); 100 Person p3("ccc", 30); 101 Person p4("ddd", 40); 102 Person p5("eee", 50); 103 104 // 向容器中添加資料 105 v.push_back(&p1); 106 v.push_back(&p2); 107 v.push_back(&p3); 108 v.push_back(&p4); 109 v.push_back(&p5); 110 111 // 遍歷容器 112 for (vector<Person*>::iterator it = v.begin(); it != v.end(); it++) { 113 cout << "姓名:" << (*it)->m_Name << " 年齡:" << (*it)->m_Age << endl; 114 115 } 116 } 117 118 119 // 示例3 120 // vector容器嵌套容器 121 void test04() { 122 vector<vector<int>> v; 123 124 // 創建小容器 125 vector<int> v1; 126 vector<int> v2; 127 vector<int> v3; 128 vector<int> v4; 129 130 // 想小容器中添加資料 131 for (int i = 0; i < 4; i++) { 132 v1.push_back(i + 1); 133 v2.push_back(i + 1); 134 v3.push_back(i + 1); 135 v4.push_back(i + 1); 136 } 137 138 // 將小容器插入到大容器中 139 v.push_back(v1); 140 v.push_back(v2); 141 v.push_back(v3); 142 v.push_back(v4); 143 144 // 通過大容器 145 for (vector<vector<int>>::iterator it = v.begin(); it != v.end(); it++) { 146 // (*it) ---- 容器 vector<int> 147 for (vector<int>::iterator vit = (*it).begin(); vit != (*it).end(); vit++) { 148 cout << *vit << " "; 149 } 150 cout << endl; 151 } 152 } 153 154 int main() { 155 156 //test01(); 157 158 //test02(); 159 160 //test03(); 161 162 test04(); 163 164 system("pause"); 165 166 return 0; 167 } 168 169 // 總結 170 // 171 // C++的面向物件與泛型編程思想,目的就是提高代碼的復用性 172 // 為了建立資料結構和演算法的一套標準,誕生了STL 173 // 174 // STL初識 175 // Standard Template Library,標準模板庫 176 // STL從廣義上分為:容器(container) 演算法(algorithm) 迭代器(iterator) 177 // 容器和演算法之間通過迭代器進行無縫銜接 178 // STL幾乎所有的代碼都采用了模板類或者模板函式 179 // 180 // SLT 6大組件 181 // 容器、演算法、迭代器、仿函式、配接器(配接器)、空間配接器 182 // 183 // 1.容器:各種資料結構,用來存放資料,如:vector、list、deque、set、map等 184 // 2.演算法:各種常用演算法,如:sort、find、copy、for_each等 185 // 3.迭代器:扮演演算法與容器之間的關系連接 186 // 4.仿函式:行為類似函式,可以作為演算法的某種策略 187 // 5.配接器:一種用來修飾容器或者仿函式或者迭代器介面的東西 188 // 6.空間配接器:負責空間的配置與管理 189 // 190 // STL中的容器、演算法、迭代器 191 // 1.容器 192 // STL容器就是運用最廣泛的一些資料結構實作出來 193 // 常用資料結構:陣列、鏈表、樹、堆疊、佇列、集合、映射表等 194 // 容器分為: 195 // 序列式容器:強調值的排序,序列式容器中的每個元素均有固定的位置 196 // 關聯式容器:二叉樹結構,各元素之間沒有嚴格的物理上的順序關系 197 // 2.演算法(Algorithms) 198 // 用有限的步驟解決問題的邏輯 199 // 演算法分為: 200 // 質變演算法:運算程序中會改變區間內的元素的內容,如:拷貝、替換、洗掉等 201 // 非質變演算法:運算程序中不會改變區間內的元素的內容,如:查找、計數、遍歷、尋找極值等 202 // 3.迭代器 203 // 演算法和容器之間溝通的橋梁 204 // 提供一種方法,使之能夠依序尋訪某個容器所包含的各個元素,而有無需暴露該容器內部的表示方式 205 // 每個容器都有自己專屬的迭代器 206 // 迭代器使用非常類似于指標 207 // 208 // 迭代器分類(5類): 209 // 輸入迭代器: 對資料只讀訪問 210 // 輸出迭代器: 對資料只寫訪問 211 // 前向迭代器: 讀寫操作,并能向前推進迭代器 212 // 雙向迭代器: 讀寫操作,并能向前和向后操作 213 // 隨機訪問迭代器:讀寫操作,可以以跳躍式方式訪問任意資料,功能最強迭代器 214 // 215 // 常用容器:雙向迭代器、隨機訪問迭代器 216 //
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/469727.html
標籤:其他
