目录
1--STL基本概念
2--STL六大组件
2-1--容器的基本概念
2-2--算法的基本概念
2-3--迭代器的基本概念
3--代码实例
3-1--vector容器的使用
3-2--使用vector容器存储自定义类型
3-3--容器嵌套容器
1--STL基本概念
STL:全称为 Standard Template Library,即标准模板库;
STL 从广义上分为:容器(container)、算法(algorithm)和迭代器(iterator)
在STL中,容器和算法之间通过迭代器进行关联,STL主要基于模板类和模板函数进行实现;
2--STL六大组件
STL分为六大组件:容器、算法、迭代器、仿函数、适配器和空间配置器;
容器:包含各种数据结构,如 vector、list、deque、set、map 等,用于存放数据;
算法:包含各种常用的算法,如 sort、find、copy、for_each等;
迭代器:连接容器与算法;
仿函数:行为类似函数,可作为算法的某种策略;
适配器:用来修饰容器、仿函数或迭代器接口;
空间适配器:负责空间的配置与管理;
2-1--容器的基本概念
容器用于存放数据,涵盖常用数据结构的实现,可分为序列式容器和关联式容器两种;
序列式容器:强调值的排序,每个元素都有固定的位置;
关联式容器:二叉树结构,各元素之间没有严格物理上的顺序关系;
2-2--算法的基本概念
利用有限的步骤解决逻辑上的问题,其可细分为质变算法和非质变算法;
质变算法:在运算过程中会更改区间内元素的内容,例如拷贝、替换和删除等;
非质变算法:在运算过程中不会更改区间内元素的内容,例如查找、计数、遍历等;
2-3--迭代器的基本概念
提供方法用于寻访容器的元素,但无需暴露容器的内部表示方式;
每个容器拥有其专属的迭代器;
迭代器的种类:
① 输入迭代器:对数据只读;
② 输出迭代器:对数据只写;
③ 前向迭代器:读写操作,能向前推进迭代器;
④ 双向迭代器:读写操作,能向前和向后实施操作;
⑤ 随机访问迭代器:读写操作,能以跳跃的方式访问任意数据,功能最强;
3--代码实例
3-1--vector容器的使用
# include <iostream>
# include <vector>
# include <algorithm> // 标准算法的头文件
void myPrint(int val){
std::cout << val << std::endl;
}
int main(){
// 创建一个 vector 容器
std::vector<int> v;
v.push_back(10);
v.push_back(20);
v.push_back(30);
v.push_back(40);
// 第一种遍历方式
// 通过迭代器访问容器中的数据
std::vector<int>::iterator itBegin = v.begin(); // 起始迭代器 指向容器中第一个元素
std::vector<int>::iterator itEnd = v.end(); // 结束迭代器 指向容器中最后一个元素的下一个位置
while(itBegin != itEnd){
std::cout << *itBegin << std::endl;
itBegin++;
}
// 第二种遍历方式
for(std::vector<int>::iterator it = v.begin(); it != v.end(); it++){
std::cout << *it << std::endl;
}
// 第三种遍历方式,利用 STL 提供的遍历算法
for_each(v.begin(), v.end(), myPrint);
return 0;
}
3-2--使用vector容器存储自定义类型
# include <iostream>
# include <vector>
# include <string>
# include <algorithm> // 标准算法的头文件
class Person{
public:
Person(std::string name, int age){
this->Name = name;
this->Age = age;
}
std::string Name;
int Age;
};
void test1(){
std::vector<Person>v;
Person p1("Zhangsan", 18);
Person p2("Lisi", 19);
Person p3("Wangwu", 20);
Person p4("Zhaoliu", 21);
v.push_back(p1);
v.push_back(p2);
v.push_back(p3);
v.push_back(p4);
// 遍历容器中的数据
for(std::vector<Person>::iterator it = v.begin(); it != v.end(); it++){
std::cout << "Name: " << it->Name << " Age: " << it->Age << std::endl;
}
}
void test2(){
std::vector<Person*>v;
Person p1("Zhangsan", 18);
Person p2("Lisi", 19);
Person p3("Wangwu", 20);
Person p4("Zhaoliu", 21);
v.push_back(&p1);
v.push_back(&p2);
v.push_back(&p3);
v.push_back(&p4);
// 遍历容器中的数据
for(std::vector<Person*>::iterator it = v.begin(); it != v.end(); it++){
std::cout << "Name: " << (*it)->Name << " Age: " << (*it)->Age << std::endl;
}
}
int main(){
test2();
return 0;
}
3-3--容器嵌套容器
# include <iostream>
# include <vector>
# include <string>
# include <algorithm> // 标准算法的头文件
// 容器嵌套容器
void test1(){
std::vector<std::vector<int>>v;
//创建小容器
std::vector<int>v1;
std::vector<int>v2;
std::vector<int>v3;
std::vector<int>v4;
//向小容器添加数据
for(int i = 0; i < 4; i++){
v1.push_back(i+10);
v2.push_back(i+20);
v3.push_back(i+30);
v4.push_back(i+40);
}
//将小容器放置在大容器中
v.push_back(v1);
v.push_back(v2);
v.push_back(v3);
v.push_back(v4);
for(std::vector<std::vector<int>>::iterator it = v.begin(); it != v.end(); it++){
for(std::vector<int>::iterator vit = (*it).begin(); vit != (*it).end(); vit++){
std::cout << *vit << " ";
}
std::cout << std::endl;
}
}
int main(){
test1();
return 0;
}