学习重点
- STL基本概念
- 理解容器的概念
- 理解迭代器的概念
- 理解算法的概念
1.STL基本概念
STL(Standard Template Library,标准模板库),是惠普实验室开发的一系列软件的统称。现在主要出现在C++中,但是在引入C++之前该技术已经存在很长时间了。
STL从广义上分为:容器(container) 算法(algorithm) 迭代器(iterator),容器和算法之间通过迭代器进行无缝连接。STL几乎所有的代码都采用了模板类或者模板函数,这相比传统的由函数或类组成的库来说提供了更好的代码重用机会
STL(Standard Template Library)标准模板库,在我们C++标准程序中隶属于STL的占到了80%以上。
在C++标准库中,STL被组织成了13个头文件
<algorithm> 、<deque>、<functional> <iterator> 、<vector>、<list>、 <map>、<memory>、<numeric>、<queue>、<set>、<stack>和<utility>
STL其他优点
- STL是C++的一部分,因此不用额外安装什么,它被内建在你的编译器之内。
- STL的一个重要特点是数据结构和算法的分离。尽管这是个简单的概念,但是这种分离确实使得STL变得非常通用。例如:在STL的vector容器中,可以放入元素、基础数据类型变量、元素的地址;STL的sort()排序函数可以用来操作vector,list等容器。
- 程序员可以不用思考STL具体的实现过程,只要能够熟练使用STL就OK了。这样他们就可以把经理放在程序开发的别的方面
- STL具有高可重用性,可移植性,跨平台的特点
- 高可重用性:STL中几乎所有的代码都采用了模板类和模板函数的方式实现,这相比于传统的由函数和类组成的库来说提供了更好的代码重用机会。关于模板的只是,已经给大家介绍了。
- 高性能:如map可以高效地从十万条记录里面查找出指定的记录,因为map是采用红黑树的变体实现的。(红黑树是平衡二叉树的一种)
- 高移植性:如果项目A用STL编写的木块,可以直接移植到项目B上
- 跨平台:如用windows的Visual Studio编写的代码可以在Mac OS 的Xcode上直接编译
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
//vector容器
void test1()
{
//容器
vector<int> v;//创建一个容器 动态数组 指定这个容器中放的数据类型 都是int
v.push_back(10);//追加元素
v.push_back(4);
v.push_back(5);
//容器和算法是各自分离的 两者的链接需要------------迭代器
vector<int>::iterator pStar = v.begin();//拿到迭代器的类型变量,指向容器的第一个元素
//=拿到了指向第一个元素的迭代器
vector<int>::iterator pEnd = v.end();//end容易让人误会,这个v.end()返回的是最后元素的后面一位,不是最后的元素
//pStar pEnd 相当于指针
while(pStar != pEnd ){
cout<<*pStar<<" "<<endl;
pStar++;
}
cout<<endl;
//算法 count统计容器中某个元素的个数
int n = count(v.begin(),v.end(),4);//统计4个个数
cout<<"n:"<<n<<endl;
}
class Teacher{
public:
Teacher(int id,int age){
this->ID = id;
this->age = age;
}
int ID;
int age;
}
void test2()
{
vector<Teacher> v; //创建一个容器,指定里面放Teacher类型的数据
Teacher t1(1,2),t2(3,4),t3(5,6);
v.push_back(t1);
v.push_back(t2);
v.push_back(t3);
vector<Teacher>::iterator pStar = v.begin();
vector<Teacher>::iterator pEnd = v.end();
int n;
while(pStar != pEnd){
Teacher t = *pStar;
cout<<"ID:"<<t.ID<<" AGE:"<<t.age<<endl;
pStar++;
}
}
//容器放类对象指针
void test3()
{
vector<Teacher*> v;//容器中放Teacher类型指针
Teacher t1(1,2),t2(3,4),t3(5,6);
Teacher *p1 = &t1;
Teacher *p2 = &t2;
Teacher *p3 = &t3;
v.push_back(p1);
v.push_back(p2);
v.push_back(p3);
vector<Teacher*>::iterator pStar = v.begin();
vector<Teacher*>::itertaor pEnd = v.end();
while(pStar != pEnd){
Teacher* ttmp = *pStar//*pStar取出来的是Teacher类型的指针
cout<<ttmp->ID<<" "<<ttmp->age<<endl;
pStar++;
}
}
int main()
{
return 0;
}
-----------------------------------------------------
//自定义count方法
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int myCount(int *pStar,int *pEnd,int value)
{
int n = 0;
while(pStar != pEnd){
if (*pStar == value)n++;
pStar++;
}
return n;
}
int main()
{
int arr[] = {3,25,32,5,1,14,3};//容器
int *pStar = arr;
int *pEnd = &arr[sizeof(arr)/sizeof(arr[0])];//&表示,不是指向那个值,是那个地址!!!
int n = myCount(pStar,pEnd,3);
cout<<"n = "<<n<<endl;
return 0;
}
2.STL三大组件的介绍
2.1容器概念的介绍
STL中容器是指存储有限数据元素的一种数据结构。比如栈(stack),队列(queue)...那么什么是数据结构,我们研究把数据按照特定的方式排列起来,便于我们查找 删除 排序 或者其他一些目的,这种不同的排序方式我们就可以叫数据结构
- 容器可以包含容器
- STL容器分为:序列式容器 和 关联式容器
例如,我要在教室里找到一个学生
- 序列式容器就是根据学生进入教室的时间和地点来决定学生在哪个位置,跟学生是谁没关系
- 关联式容器是指我教室的座位按照一定规则确定好了,每个学生进来,比如根据学生出生年月,从小到大排序,学生坐在哪个位置,必须由我的规则来规定
2.2迭代器介绍
迭代器是一种抽象的概念,现实中不容易找出来某项食物与之对应,所以比较难理解。
但是在我们程序中,比如我们写的数据,我们通过[]操作符遍历取值,那么[]就是一个迭代器,也必须说我们经常用的指针,它也是一种迭代器。

迭代器(iterator)是一种对象,它能够用来遍历标准模板库容器中的部分或全部元素,每个迭代器对象代表容器中确定的地址。迭代器修改了常规指针的接口,所谓迭代器是一种概念上的抽象:那些行为上像迭代器的东西都可以叫做迭代器,也就是说迭代器是对我们普通的指针做了一层封装,其行为也类似指针。我们现在呢?单纯可把迭代器理解为,它就是一个指针,用来指向不同的元素,既然是指针,那么指针的一些基本运算操作,比如*、++、==、!=、=,迭代器也可以进行这样的操作
2.3算法介绍
以有限的步骤,解决逻辑或者数学上的问题,这门学科我们就叫做算法。一般来说,我们每天都在写各种各样的算法,比如我们写的每一个函数,它被用来解决或大或小的问题。
在我们工作中,我们要写一个算法来解决一个问题的时候,那么需要考虑你写的算法需要消耗的计算机资源,包括时间和空间,如果你写一个算法需要消耗1G内存来解决这个问题,那么你这个算法也就没有什么价值了。
STL为我们提供了算法,都很高效,而且还有最大的特点,可复用性。那么我们学习算法,就很简单了,我们只需要去熟悉应用STL为我们提供的常用算法就OK了
STL提供了大约100个实现算法的模板函数,比如算法for_each将制定序列中的每一个元素调用制定的函数等。这样一来,只要我们熟悉了STL之后,许多代码可以被大大的简化,只需要通过调用一两个算法函数,就可以完成所需要的功能并大大提升效率
2.4总结
容器就是数据结构,用来将数据元素按照一定的规则进行排序,不同的容器拥有不同的排序规则,不同的排序规则可以达到不同的数据操作特点,比如数据这种数据结构,我们随机存取就很高效,算法就是提供对容器数据严肃的一些操作,比如遍历容器元素,删除容器元素等迭代器就是容器和算法之间的桥梁,粘合剂,用来将两个相对独立的部件建立起关系

网友评论