C++的面向对象和泛型编程思想,目的就是复用性的提升
为了建立数据结构和算法的一套标准,诞生了STL
STL(Standard Template Library, 标准模板库)
STL从广义上分为:容器(container)算法(algorithm)迭代器(iterator)
容器和算法之间通过迭代器进行无缝连接
STL几乎所有的代码都采用了模板类或者模板函数
STL大体分为六大组件,分别是:容器、算法、迭代器、仿函数、适配器(配接器)、空间配置器
迭代器使用非常类似于指针,初级阶段可以先理解迭代器为指针。
算法要通过迭代器才能访问容器中的元素
常用的容器中迭代器种类为双向迭代器,和随机访问迭代器
STL中最常用的容器为Vector,可以理解为数组
容器:vector
算法:for_each
迭代器:vector
void myPrint(int num)
{
cout << num << endl;
}
void test01()
{
//创建vector容器对象,且通过模板参数指定容器中存放的数据的类型
vector array;
//向容器中放数据
array.push_back(10);
array.push_back(20);
array.push_back(30);
array.push_back(40);
//每个容器都有自己的迭代器,迭代器用来遍历容器中的元素
//array.begin()返回迭代器,这个迭代器指向容器中第一个数据
//array.end()返回迭代器,这个迭代器指向容器元素的最后一个元素的下一个位置
//vector::iterator 拿到vector这种容器的迭代器类型
//第一种遍历方式
vector::iterator begin = array.begin();
vector::iterator end = array.end();
while (begin != end)
{
cout << *begin << endl;
begin++;
}
//第二种遍历方式
for (vector::iterator i = array.begin(); i != array.end(); ++i)
{
cout << *i << endl;
}
//第三种遍历方式,利用STL提供遍历算法
//头文件algorithm
for_each(array.begin(), array.end(), myPrint);
}
void test01()
{
vector v;
v.push_back(Person("aaa", 11));
v.push_back(Person("bbb", 23));
v.push_back(Person("ccc", 34));
v.push_back(Person("ddd", 24));
v.push_back(Person("eee", 41));
for (vector::iterator i = v.begin(); i != v.end(); ++i)
{
//cout << "姓名:" << i->m_Name << ",年龄:" << i->m_Age << endl;
cout << "姓名:" << (*i).m_Name<< ",年龄:" << (*i).m_Age << endl;
}
}
void test02()
{
vector v;
Person p1 = Person("aaa", 11);
Person p2("bbb", 23);
Person p3("ccc", 34);
Person p4("ddd", 24);
Person p5("eee", 31);
v.push_back(&p1);
v.push_back(&p2);
v.push_back(&p3);
v.push_back(&p4);
v.push_back(&p5);
for (vector::iterator i = v.begin(); i != v.end(); ++i)
{
//cout << "姓名:" << i->m_Name << ",年龄:" << i->m_Age << endl;
cout << "姓名:" << (*i)->m_Name << ",年龄:" << (*i)->m_Age << endl;
}
}
类似二维数组
void test01()
{
vector> v;
vectorv1;
vectorv2;
vectorv3;
vectorv4;
for (int i = 0; i < 4; ++i)
{
v1.push_back(i + 1);
v2.push_back(i + 2);
v3.push_back(i + 3);
v4.push_back(i + 4);
}
//把小容器插入到大容器中
v.push_back(v1);
v.push_back(v2);
v.push_back(v3);
v.push_back(v4);
//通过大容器,把所有数据遍历一遍
for (vector>::iterator it = v.begin(); it != v.end(); ++it)
{
// (*it) ---容器 vector
for (vector::iterator vit = (*it).begin(); vit != (*it).end(); ++vit)
//for (vector::iterator vit = it->begin(); vit != it->end(); ++vit)
{
cout <<*vit << " ";
}
cout << endl;
}
}