C++基础:STL概述

发布于:2024-07-05 ⋅ 阅读:(13) ⋅ 点赞:(0)

前言

        写一点STL入门指南的内容,厘清一些概念.

引入

        STL全称:Standard Template Library.译名:标准模板库.是C++里比较重要的部分.主要内容是围绕着数据结构进行的.

问题

         在<<C++ Prime Plus>> 6th Edition这本书里,标准模板库的内容有些晦涩,很多概念让人摸不着头脑,学起来有难度.

        我想原因有以下两点:

        1>每一件新事物在设计的时候,设计者都有着思想,概念,具体实现三个层面的东西..STL的内容本来比较多,<<C++ Prime Plus>> 6th Edition(以下称为"本书")这本书里只讲了设计思想,概念,有一部分代码实现但不多.说白了看不到源码有的内容不好理解.

        2>STL的内容和数据结构相关.所以最好有一些数据结构的基础.有人说数据结构已经让人头大了,加上这个岂不是更难?事实和这种想法恰恰相反,会使用STL,大大简化数据集合的建立.所以STL的学习应该被看作是一个比较愉快的过程.

        本书内容告诉你"这是什么"和"这个怎么用",但是有的地方没告诉你"这个是怎么来的".这是学习的难点所在.本书中STL的内容学了也可以用了,只不过在学习过程中有那么一点不适应,也是正常的.

STL和模板的关系

        模板是泛型的实现,将类型参数化.而STL是模板成功的应用. 模板提供了一个工具:"你可以用我来建立一个数据集合,他长什么样,能实现什么功能,全由你来定".STL做到了,而且把实现了的数据结构,算法等标准化成了文件,供程序员使用

STL的内容

        本书P674----16.3标准模板库,黑标题下第一句话:STL提供一组表示容器,迭代器,函数对象和算法的模板.STL的四大组成:容器,迭代器,函数对象,算法

如何着手学习STL

        我一直推崇的是在理解的基础上学习.但本书给的源码资源不多.而且STL源码的学习会耗费不少时间(笔者目前看过一部分) ,为了保证学习效率,理解和机械记忆相结合的方法比较合适.毕竟正确使用才是最终目的,能用的直接先用. 因为这部分内容特别重要,接下来就用学文科的方法,跟着本书一页一行的看,争取弄清每一个知识点.         

从模板类vector开始

         本书P675

        1>vector对象的建立
#include<iostream>
#include<vector>
using namespace std;

int main(void) {
	vector<int> rating(5);		//生成一个名叫rating的vector模板类对象,含5个int类型元素
	int n;
	cout << "请输入元素个数" << endl;
	cin >> n;
	vector<double> scores(n);	//生成一个名叫scores的vector模板类对象,含5个double类型元素	
	scores[0] = 9.0;			//赋值给scores对象首元素
	for (int i = 0; i < n; i++)
		cout << scores[i] << endl;
}

----代码和本书相比稍有改动,解读如下:

        1.模板类对象生成和class对象声明不一样.

        class对象声明: 类型名+对象名(构造函数形参1,形参2....)    //生成一个对象并调用构造函数              模板对象声明:  类型名+对象名(元素个数)    //类型名由"模板类型名+<数据类型名>"组成

         2. 用对象+[]提供了随机访问,类似于指针的操作       

scores[0] = 9.0;			    //赋值给scores对象首元素
for (int i = 0; i < n; i++)
	cout << scores[i] << endl;  //随机访问索引i的对象元素  

         ----vector模板支持随机访问,所以可用.否则不可这样使用.

        2>分配器

        分配器是专门的内容,因为template<class T,class Allocator=allocator<T> >写法和普通模板定义不一致,属于特别内容,可翻阅相关资料,暂时可以不管. 

        3>所有STL容器都提供的基本方法

        本书P676到数第5行,举了几个例子:

        size():返回容器中元素数目;                   swap():交换两个容器的内容

        begin():返回指向容器中第一个元素的迭代器; end():返回一个超过容器尾的迭代器

        这个比较容易理解:容器类定义的成员函数,调用时用声明的容器类对象去调用.

        注意:所有容器都有的方法

        4>迭代器

         迭代器是广义指针.  ---对迭代器的定义,迭代器基本上等同于指针

         STL为不同的容器类提供统一接口,每个容器类都定义一个合适的迭代器.---这句话比较重要,迭代器是用容器类里的一个内部类---Iterator实现的,每个容器都有他.迭代器内容单独列出

        用迭代器遍历整个容器的内容,这段通用代码,可以记录下来复制粘贴

for(pd=scores.begin();pd!=scores.end();pd++)    //pd遍历数据集合
    cout<<*pd<<endl;                            //*pd获得值
        5>vector模板类包含一些只有某些STL容器才有的方法 

        push_back():添加到容器末尾;         

        erase():删除容器中给定区间的元素,2个迭代器参数,区间不包括第2个参数指向位置.

        insert():插入给定区间元素.3个迭代器参数,第1个是插入位置,第2和第3表示插入区间,意思和erase()相同,不包括第3个迭代器参数指向位置.

        ---因为用了超尾迭代器,所以很方便插入到末尾.(当插入位置使用超尾迭代器时)

        几个api的用法不是很关键,用的时候查阅就可以了.

        注意:本书原话---只有某些STL容器才有的方法.表明vector被归纳到某个种类的STL中,他们有同名的成员函数来完成相同的事

        6> 处理容器类对象的非成员函数

        本书P680,倒数第三段

         非成员函数是独立于模板类的,这点和上面定义在每个容器类的成员函数不同,意思是"试图"建立一种"通用"的函数来解决所有模板类对象的问题.实际上和后面的"算法"含义一致.

        举了三个例子:

        for_each(),random_shuffle(),sort()      

        注意:非成员函数的使用有范围,区分容器类型.比如P681页说了for_each()适用于任何容器类,而random_shuffle(),sort() 要求容器支持随机访问.

        7>基于范围的for循环

===============================小问题===================================== 

        for_each()是否只适用于数组,不适用于链表?范围for循环是否适用于链表?但不管怎么说,他们都适用于数组

===============================小问题===================================== 

        for循环和for_each()在遍历读取数据集合元素时没区别.

        区别在:for_each()不能修改元素,基于范围的for循环可以由形参声明为引用类型,来修改元素.这点和上一篇帖子说到"引用在定义和使用时是变量,在函数内部是指针"是相符的.

小结

        以<<C++ Prime Plus>> 6th Edition这本书中关于STL部分内容为参考,按照书中内容先后顺序,理解几个STL相关概念,为下一步学习做准备

        

         

 

       


网站公告

今日签到

点亮在社区的每一天
去签到