//STL(标准模板库)
//STL广义上分为:容器,算法,迭代器
//容器和算法之间通过迭代器进行无缝连接
//容器:
//序列式容器:容器元素的位置是由进入容器的时间和地点来决定的
//关联式容器:容器已经有固定的规则,进入容器元素的位置在进入之前就已经确定,与进入容器的时间和地点无关
//迭代器:
//迭代器相当于数组的指针,迭代器起始是指向容器第一个元素,迭代器加加和减减也是增加或减少一个元素的长度,可以理解为指针
//迭代器实质上是一个类对象,迭代器的类封装了一个指针,并重写了很多操作符
//算法:
//通过有限的步骤,解决问题
//STL提供了大约100多种算法函数模板
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <vector>//容器头文件
#include <algorithm>//算法头文件
using namespace std;
class Person
{
public:
Person(int id, int age) :id(id), age(age) {}
int getId()
{
return id;
}
int getAge()
{
return age;
}
private:
int id;
int age;
};
//算法,负责统计某个元素的个数
int myCount(int *begin, int *end, int val)
{
int count = 0;
while (begin != end)
{
if (*begin == val)
{
count++;
}
begin++;
}
return count;
}
void printVector1(int v)//回调打印函数的形参为容器里数据的类型
{
cout << v << endl;
}
void printVector2(Person v)
{
cout << "id = " << v.getId() << endl;
cout << "age = " << v.getAge() << endl;
}
void printVector3(Person *v)
{
cout << "this->id = " << v->getId() << endl;
cout << "this->age = " << v->getAge() << endl;
}
int main()
{
//数组,本质上也是一个容器
int arr[] = { 1,3,6,7,4,5,9,5,5 };
//下面两段代码即为迭代器类中的成员变量
int *begin = arr;//迭代器起始位置
int *end = &(arr[sizeof(arr) / sizeof(int)]);//这是指向数组最后一个元素的下一个位置,并不是真相最后一个元素
int count = myCount(begin, end, 5);
cout << "count = " << count << endl;
//STL基本语法
vector<int> v1;//定义一个容器,并指定这个容器存放的元素类型是int
v1.push_back(10);//放在尾部
v1.push_back(20);//放在更尾部
v1.push_back(30);
//通过STL提供的for_each算法,进行遍历
//容器提供迭代器
//也可以这样写
vector<int>::iterator pBegin = v1.begin();//这就是v的起始迭代器
vector<int>::iterator pEnd = v1.end();//不能直接使用begin和end,这两个变量好像被系统使用了
//容器里的类型不确定,因此for_each调用第三个参数进行数据打印,即传入vector元素进入第三个参数中,进行数据打印
for_each(v1.begin(), v1.end(), printVector1);
//容器也可以存放对象
vector<Person> v2;
Person p1(10, 20), p2(30, 40), p3(50, 60);
v2.push_back(p1);
v2.push_back(p2);
v2.push_back(p3);
for_each(v2.begin(), v2.end(), printVector2);
//不使用算法,自己遍历
//自己遍历的时候,一定需要定义出迭代器,牢记
vector<Person>::iterator it = v2.begin();//取到v2的起始迭代器
while (it != v2.end())
{
printVector2(*it);
it++;
}
//传入对象指针
vector<Person *> v3;
v3.push_back(&p1);
v3.push_back(&p2);
v3.push_back(&p3);
for_each(v3.begin(), v3.end(), printVector3);
return 0;
}