STL基本介绍
STL
——Standard Template Library
,标准模板库- 广义上分为
容器(container)
、算法(algo)
、迭代器(interator)
容器
和算法
通过迭代器
衔接- 几乎所有代码都采用了
模板类
或模板函数
实现
STL六大组件
容器、算法、迭代器、仿函数、适配器、空间配置器
核心组件
-
容器
实现了运用最广泛的一些数据结构 常用数据结构:数组、链表、树、栈、队列、集合、映射表等 分类: 序列式容器 —— 容器每个元素具有固定位置 关联式容器 —— 容器中元素没有严格物理上的顺序关系,如二叉树结构
-
算法
各种常用算法,sort(排序)、find(查找)、copy(拷贝)等 分类: 质变算法 —— 运算后区间元素值会改变,如增、删、改等 非质变算法 —— 运算后区间元素值会改变,如查、计数、遍历等
-
迭代器
容器和算法之间的桥梁 每个容器都有自己专属的迭代器 其使用类似指针
分类 功能 支持的运算 输入迭代器 只读访问数据 ++、==、!= 输出迭代器 只写访问数据 ++ 前向迭代器 读写,并能向前推进迭代 ++、==、!= 双向迭代器 读写,能向前向后迭代 ++、– 随机访问迭代器 读写操作,可以访问任意数据 ++、–、[n]、-n、<、<=、>、>=
vector容器的简单使用
vector
容器是最常用的容器之一,可以理解成数组
#include <iostream>
#include <vector> //容器头文件
#include <algorithm> //算法头文件
using namespace std;
class student
{
public :
int id;
string name;
student(string name, int id);
};
student::student(string name, int id)
{
this->id = id;
this->name = name;
}
void exp1(void)
{
//创建vector对象,并指定存放数据类型为int
vector<int> v;
for (int i = 0; i < 50; i++)
{
v.push_back(i); //将数据放入容器中最末端元素的下一位置
}
//每个容器都有迭代器,用来遍历容器中的元素
vector<int>::iterator int_begin = v.begin();
//v.begin()指向容器的第一个元素
vector<int>::iterator int_end = v.end(); //v.end指向容器最后一个元素的下一个位置
//for循环遍历容器
for (vector<int>:: iterator i = int_begin; i != int_end; i++)
{
cout << *i << endl;
}
}
void exp2(void)
{
vector<student> stu_v; //存放自定义类型容器
vector<student*> pstu_v; //存放指针的容器
student stu1("彭佬", 3434);
student stu2("王佬", 53562);
student stu3("王总", 2435);
student stu4("许菜鸟", 250);
stu_v.push_back(stu1);
stu_v.push_back(stu2);
stu_v.push_back(stu3);
stu_v.push_back(stu4);
pstu_v.push_back(&stu1);
pstu_v.push_back(&stu2);
pstu_v.push_back(&stu3);
pstu_v.push_back(&stu4);
for (vector<student>::iterator it = stu_v.begin(); it != stu_v.end(); it++)
{
cout << "name :" << it->name << endl; //从这里可以看出迭代器类似指针
cout << "id :" << it->id << endl;
}
cout << "\r\n";
for (vector<student*>::iterator pit = pstu_v.begin(); pit != pstu_v.end(); pit++)
{
student *pstu = *pit; //得到指针
cout << "student name :" << pstu->name << endl;
cout << "student id :" << pstu->id << endl;
}
}
int main()
{
exp1();
exp2();
return 0;
}