STL
1、STL的概述
1.1、STL的三大组件:容器(container) 算法(algorithm) 迭代器(iterator)。
1.2、STL:六大组件:
容器 算法 迭代器 仿函数 适配器 空间配置器
容器:存放数据
算法:操作数据
迭代器:容器和算法的桥梁
仿函数:为算法 提供更多的策略
适配器:为算法 提供更多的参数接口
空间配置器:管理容器和算法的空间
1.3、算法的分类:
质变算法 和 非质变算法
质变算法:是指运算过程中会更改区间内的元素的内容。例如拷贝,替换,删除等等
非质变算法:是指运算过程中不会更改区间内的元素内容,例如查找、计数、遍历、寻找极值等等
1.4、迭代器的分类:
2、迭代器
案例:容器vector
#include < algorithm>//标准模版库(STL)
vector< int> v;//定义一个vector容器 v
for_each(v.begin(), v.end(), myPrintInt);//for_each 从容器的起始—>结束 逐个元素取出,myPrintInt是用户写到容器数据的打印方式
#include <iostream>
#include<vector> //vector头文件
#include<algorithm>//标准模版库(STL)中最重要的头文件之一,提供了大量基于迭代器的非成员模版函数。
using namespace std;
void myPrintInt(int val);
void test01()
{
//单端动态数组vector 类模板
vector<int> v;//v就是一个具体的vector容器
//pash_back 尾部插入
v.push_back(100);
v.push_back(200);
v.push_back(300);
v.push_back(400);
//访问数据
//定义一个迭代器存储 v的起始迭代器
vector<int>::iterator biginIt = v.begin();
//定义一个迭代器存储 v的结束迭代器
vector<int>::iterator endIt = v.end();
//for循环遍历1
for(;biginIt != endIt; biginIt++)
{
//对迭代器取* 代表的是 容器的元素
//*biginIt
cout<<*biginIt<<" ";
}
cout<<endl;
//for循环遍历2(推荐)
for(vector<int>::iterator it=v.begin(); it !=v.end(); it++)
{
cout<<*it<<" ";
}
cout<<endl;
//STL提供的算法来遍历容器(包含算法头文件 algorithm)
//for_each 从容器的起始--->结束 逐个元素取出
//myPrintInt 容器数据的打印方式
for_each(v.begin(), v.end(), myPrintInt);
cout<<endl;
}
void myPrintInt(int val)
{
cout<<val<<" ";
}
int main(int argc, char *argv[])
{
test01();
return 0;
}
运行结果:
深入了解for_each
案例2:容器也可以存放自定义数据类型
void myPrintPerson(Person &ob)
{
cout<<"name = "<<ob.name<<", age ="<<ob.age<<endl;
}
void test02()
{
Person ob1("德玛", 18);
Person ob2("小炮", 28);
Person ob3("小法", 38);
Person ob4("小智", 48);
//定义一个vector容器存放ob1~ob4的数据
vector<Person> v;
v.push_back(ob1);
v.push_back(ob2);
v.push_back(ob3);
v.push_back(ob4);
for_each(v.begin(), v.end(), myPrintPerson);
}
int main(int argc, char *argv[])
{
test02();
return 0;
}
运行结果:
案例:容器嵌套容器
void Print(vector<int> &v);
void text()
{
vector<int> v;
vector<int> v1;
vector<int> v2;
v.push_back(10);
v.push_back(20);
v.push_back(30);
v.push_back(40);
v1.push_back(100);
v1.push_back(200);
v1.push_back(300);
v1.push_back(400);
v2.push_back(1000);
v2.push_back(2000);
v2.push_back(3000);
v2.push_back(4000);
//定义一个vector容器存放v,v1,v2的数据
vector<vector<int>> v3;
v3.push_back(v);
v3.push_back(v1);
v3.push_back(v2);
//方式1
for(vector<vector<int>>::iterator it = v3.begin(); it!=v3.end(); it++)
{
//*it == vector<int> v1 v2 v3
for(vector<int>::iterator mit=(*it).begin(); mit!=(*it).end(); mit++ )
{
//*mit ==int
cout<<*mit<<" ";
}
cout<<endl;
}
//方式2
for_each(v3.begin(),v3.end(),Print);
}
void Print(vector<int> &v)//v=v v1 v2
{
for(vector<int>::iterator it=v.begin();it!=v.end();it++)
{
cout<<*it<<" ";
}
cout<<endl;
}
运行结果: