01--STL泛型编程了解
开始学习侯捷老师的课程了~~
一:六大组件关系
容器(Container) 算法(Algorithm) 迭代器(Iterator) 仿函数(Function object) 适配器(Adaptor) 空间配制器(allocator)
二:组件调用
#include <vector> #include <algorithm> #include <functional> #include <iostream> #include <cstdlib> using namespace std; //https://www.cnblogs.com/freeopen/p/5482962.html int main01() { int ia[6] = { 27, 210, 12, 47, 167, 83 }; //1.容器 2.分配器 //分配器可以不写,会有默认,但是两者要一致。<>是模板函数 //前闭后开区间??[) vector<int, allocator<int>> vi(ia, ia + 6); //设置初值 //3.算法 4.迭代器 5.仿函数 6.适配器 //找到大于等于40数 cout << count_if(vi.begin(), vi.end(), //count是计算数量 not1(bind2nd(less <int>(), 40)))<<endl; //_if是指含有条件, //less <int>()函数小于 //bind2nd绑定第二个参数40.小于40 //not1否,不小于40 //后面跟上小于40的条件 //遍历 vector<int>::iterator iter = vi.begin(); for (; iter != vi.end();++iter) { cout << *iter << " "; } //C11 /* for(decl:col1){ .... } */ cout << endl; for (int i : {2,3,4,5,8,9,46,12}) { cout << i << " "; } //引用操作 cout << endl; for (auto& elem : vi) //auto让编译器自己辨别(不太好)等号从右向左,先知道返回类型,再确定auto int { elem *= 3; } cout << endl; for (auto elem : vi) { cout << elem << " "; } system("pause"); return 0; }
补充1:前闭后开区间
默认是 .begin()找到第一个元素,泛型指针指向他 .end()找到的不是最后一个元素,而是最后一个元素的下一个元素。不允许*(c.end())会溢出
三:使用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上直接编译。
四:容器---用来管理一组元素
或者
(一)容器分类---序列式和关联式
1.序列式容器:vector、deque、list
每个元素都有固定位置--取决于插入时机和地点,和元素值无关。
2.关联式容器:set、multiset、map、multimap
元素位置取决于特定的排序准则,和插入顺序无关
(二)容器描述
五:迭代器
几乎STL提供的所有算法都是通过迭代器存取元素序列进行工作的,每一个容器都定义了其本身所专有的迭代器,用以存取容器中的元素。
迭代器部分主要由头文件<utility>,<iterator>和<memory>组成。 <utility>是一个很小的头文件,它包括了贯穿使用在STL中的几个模板的声明, <iterator>中提供了迭代器使用的许多方法,而对于<memory>的描述则十分的困难,它以不同寻常的方式为容器中的元素分配存储空间,同时也为某些算法执行期间产生的临时对象提供机制,
<memory>中的主要部分是模板类allocator,它负责产生所有容器中的默认分配器。
六:算法
STL提供了大约100个实现算法的模版函数,比如算法for_each将为指定序列中的每一个元素调用指定的函数,stable_sort以你所指定的规则对序列进行稳定性排序等等。这样一来,只要熟悉了STL之后,许多代码可以被大大的化简,只需要通过调用一两个算法模板,就可以完成所需要的功能并大大地提升效率。
算法部分主要由头文件<algorithm>,<numeric>和<functional>组成。 <algorithm>是所有STL头文件中最大的一个(尽管它很好理解),它是由一大堆模版函数组成的,可以认为每个函数在很大程度上都是独立的,其中常用到的功能范围涉及到比较、交换、查找、遍历操作、复制、修改、移除、反转、排序、合并等等。 <numeric>体积很小,只包括几个在序列上面进行简单数学运算的模板函数,包括加法和乘法在序列上的一些操作。 <functional>中则定义了一些模板类,用以声明函数对象。