ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2022-05-05 22:02:40  阅读:139  来源: 互联网

标签:容器 进阶 iterator STL back C++ Person vector push


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

 

标签:容器,进阶,iterator,STL,back,C++,Person,vector,push
来源: https://www.cnblogs.com/LYH-win/p/16225849.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有