C++进阶-2-STL初识(容器、算法、迭代器等)

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 //