STL初识
STL基本概念
- STL(Standard Template Library 标准模板库)
- STL从广义上分为::容器(container)算法(algorithm)送代器(iterator)。
- 容器和算法之间通过代器进行无缝连接。
- STL几乎所有的代码都采用了模板类或者模板函数
STL六大组件
STL大体分为六大组件,分别是:容器、算法、迭代器、仿函数、适配器(配接器)、空间配置器
STL大体分为六大组件,分别是:容器、算法、迭代器、仿函数、适配器(配接器)、空间配置器
1.容器:各种数据结构,如vector、listdeque、set.map等用来存放数据。
2.算法:各种常用的算法,如sort、find,copy、foreach等
3.迭代器:扮演了容器与算法之间的胶合剂。
4.仿函数:行为类似函数,可作为算法的某种策略
5适配器:-种用来修饰容器或者仿函数或迭代器接口的东西。
6.牢间配置器:负责空间的配置与管理。
STL中容器、算法、迭代器
容器:置物之所也
STL容罢就是将运用最广泛的一此数据结构实现出来
堂用的教氓结构:数组链表树栈,队列,生合,映时表等
这些容器分为序列式容器和关联式容器两种:
序列式容器:强调值的排序,序列式容器中的每个元素均有固定的位置关联式容器:二叉树结构,各元素之间没有严格的物理上的顺序关系
算法:问题之解法也
有限的步骏,解决逻辑或数学上的问题,这一门学科我们叫做算法(Algorithms
算法分为:质变算法和非质变算法。
质变算法:是指运算过程中会更改区间内的元素的内容。例如拷贝,替换,删除等等
非质变算法:是指运算过程中不会更改区间内的元索内容,例如查找、计数、遍历、寻找极值等等
迭代器:容器和算法之间粘合剂
提供一种方法,使之能够依序寻访某个容器所含的各个元素,而又无需暴露该容器的内部表示方式每个容器都有自己专属的迭代器
迭代器使用非常类似于指针,初学阶段我们可以先理解迭代器为指针
Vector容器的初识
STL中最常用的容器为Vector,可以理解为数组。
使用vector需要包含头文件
声明容器方式:vector<数据类型>名
它的迭代器:vector<数据类型>::iterator 名
vector 存放内置数据类型
容器:vector
算法:for_each
迭代器:vector::iterator
示例:
创建一个vector容器
vector<int>v;
向容器中插入数据,vector 中的push_back函数作用是尾插数据。
v.push_back(10);
v.push_back(20);
v.push_back(30);
v.push_back(40);
通过迭代器访问容器中的数据:
v.begin()返回第一个元素的地址
v.end()返回最后一个元素的下一个地址
vector::iterator itBegin 创建起始迭代器,指向第一个元素
vector::iterator itEnd 创建结束迭代器 ,指向最后一个元素的下一个位置
vector<int>::iterator itBegin=v.begin();
vector<int>::iterator itEnd=v.end();
这样就可以通过解引用的方式访问容器中的元素了:
while(itBegin!=itEnd)
{
cout<<*itBegin<<endl;
itBegin++;
}
以上是一种访问容器元素的方式,部分代码可简化:
vector<int>::iterator itBegin=v.begin();
for(vector<int>::iterator itBegin=v.begin();itBegin!=v.end();itBegin++)
{
cout<<*itBegin<<endl;
}
第三种方式,利用STL提供遍历算法
首先要包含算法头文件:
利用for_each(容器中第一个元素地址,最后一个元素的下一个地址,函数名)
首先要在前面写一个函数:
void myPrint(int val)
{
cout<<val<<endl;
}
然后调用
for_each(v.begin(),v.end(),myPrint);
vector容器的嵌套使用
vector容器可以嵌套使用,即vector容器的数据类型还是一个vector容器;这里需要关注的是vector容器迭代器的使用。
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++)
{
for(vector<int>::iterator abc=(*it).begin();its!=(*it).end;its++)
{
cout<<*abc<<" ";
}
cout<<endl;
}
这里需注意:
*it得到的是嵌套内部的第一个vector容器,
设置abc=(*it).begin() 即abc是指向第一个容器的第一个元素的地址,这时已经和普通vector容器的用法一致了。