C++的面向对象和泛型编程思想,目的就是复用性的提升
为了建立数据结构和算法的一套标准,诞生了STL
STL基本概念
STL(Standard Template Library, 标准模板库)
STL从广义上分为:容器(container)算法(algorithm)迭代器(iterator)
容器 和算法 之间通过迭代器进行无缝连接
STL几乎所有的代码都采用了模板类或者模板函数
STL六大组件
STL大体分为六大组件,分别是:容器、算法、迭代器、仿函数、适配器(配接器)、空间配置器
- 容器:各种数据结构,如vector、list、deque、set、map等,用来存放数据。
- 算法:各种常用的算法,如sort、find、copy、for_each等
- 迭代器:扮演了容器与算法之间的胶合剂。
- 仿函数:行为类似函数,可作为算法的某种策略。
- 适配器:一种用来修饰容器或者仿函数或迭代器接口的东西。
- 空间配置器:负责空间的配置与管理。
STL中容器、算法、迭代器
迭代器使用非常类似于指针,初级阶段可以先理解迭代器为指针。
算法要通过迭代器才能访问容器中的元素
常用的容器中迭代器种类为双向迭代器,和随机访问迭代器
容器算法迭代器初识
STL中最常用的容器为Vector,可以理解为数组
vector存放内置数据类型
容器:vector
算法:for_each
迭代器:vector<int>::iterator
void myPrint(int num)
{
cout << num << endl;
}
void test01()
{
//创建vector容器对象,且通过模板参数指定容器中存放的数据的类型
vector<int> array;
//向容器中放数据
array.push_back(10);
array.push_back(20);
array.push_back(30);
array.push_back(40);
//每个容器都有自己的迭代器,迭代器用来遍历容器中的元素
//array.begin()返回迭代器,这个迭代器指向容器中第一个数据
//array.end()返回迭代器,这个迭代器指向容器元素的最后一个元素的下一个位置
//vector<int>::iterator 拿到vector<int>这种容器的迭代器类型
//第一种遍历方式
vector<int>::iterator begin = array.begin();
vector<int>::iterator end = array.end();
while (begin != end)
{
cout << *begin << endl;
begin++;
}
//第二种遍历方式
for (vector<int>::iterator i = array.begin(); i != array.end(); ++i)
{
cout << *i << endl;
}
//第三种遍历方式,利用STL提供遍历算法
//头文件algorithm
for_each(array.begin(), array.end(), myPrint);
}
Vector存放自定义数据类型
void test01()
{
vector<Person> 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<Person>::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<Person*> 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<Person*>::iterator i = v.begin(); i != v.end(); ++i)
{
//cout << "姓名:" << i->m_Name << ",年龄:" << i->m_Age << endl;
cout << "姓名:" << (*i)->m_Name << ",年龄:" << (*i)->m_Age << endl;
}
}
Vector容器嵌套容器
类似二维数组
void test01()
{
vector<vector<int>> v;
vector<int>v1;
vector<int>v2;
vector<int>v3;
vector<int>v4;
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<vector<int>>::iterator it = v.begin(); it != v.end(); ++it)
{
// (*it) ---容器 vector<int>
for (vector<int>::iterator vit = (*it).begin(); vit != (*it).end(); ++vit)
//for (vector<int>::iterator vit = it->begin(); vit != it->end(); ++vit)
{
cout <<*vit << " ";
}
cout << endl;
}
}