STL学习笔记1

1.STL六大组件
1.容器(containers):存放数据,如vector、list、deque、set、map
2.通用算法(algorithms):如sort、search、copy、erase.
3.迭代器(iterator):迭代器分为五种input迭代器,output迭代器、正向迭代器(哈希表)、双向迭代器(list 、map、set)、随机迭代器(vector和双端队列)。(栈队列不具有迭代器特性)。
4.仿函数(functors):行为像对象,调动是以函数形式调动。
5.配接器(adapters):
6.空间配置器(allocators):
2.SGI STL版本是Linux下使用的stl版本。
3.空间配置器
3.1.构造和析构基本工具(construct()和destroy())
c++中对象的创建一般分为两个阶段:1.申请空间2.调动构造函数
销毁也分为两个阶段:1.调动析构函数2.释放空间
为了精密分工stl将这两个阶段分离开来,把内存的配置动作交给alloc::allocate()来处理,内存的释放工作由alloc:: deallocate()来处理,对象的创建由创建函数::construct()函数负责,析构函数由::destroy()函数负责。
在stl中存在一个头文件,该头文件中包含两个文档:

#include<stl_alloc.h>//进行空间的配置和回收
#include<stl_construct.h>//进行对象的建立和析构,包含两个全局函数construct()和destroy()

在这里插入图片描述
在这里插入图片描述
3.1.1对于析构函数的分析以及书写。
对于大批的调用无关紧要的析构函数,对于性能方面我们将不能忍受。
在这里插入图片描述
如何知道迭代器所指之物的析构函数是否为无关紧要?我们将通过4.迭代器进行引入以及解决。
4.迭代器:迭代器是一种抽象的概念,现在程序设计语言中没有直接对应于这种概念的实物,23中设计模式中其中的一种就是迭代器模式。
4.1迭代器设计思维:stl关键所在
不论是泛型思维或者stl设计运用,迭代器都扮演者重要角色。提供一种方法,使得依序访问某聚合物所含的各个元素而又不暴露该聚合物内部表达方式。(迭代器屏蔽掉容器的底层)STL的中心思想在于将对象容器和算法分离开来,彼此独立设计最后以迭代器把他们联合起来。
4.1.1迭代器可以看做是一种智能指针
4.1.2迭代器的相应型别
(1)迭代器所指之物的型别是迭代器的值类型value type。任何一个打算与STL算法有完美搭配的class,都应该设定自己的value type类型。
(2)两个迭代器之间的距离是迭代器的差值类型difference type。即两个迭代器之间元素或对象的个数,差值类型一般是一个整型。
(3)迭代器的引用类型reference type。从迭代器所指之物是否允许改变的角度,迭代器分为两种:不允许改变迭代器所指之物(constant iterator),允许改变迭代器所指之物(mutable iterator)
(4)迭代器的指针类型pointer type。
(5)迭代器的类型型别可以划分为五种::input迭代器,output迭代器、正向迭代器、双向迭代器、随机迭代器(能力最强)

迭代器的调用设计采用晚绑定,在运行的时候确定使用哪一个方法

template <class InputIterator, class Distance>
void advance(InputIterator& i, Distance n)
{
    if(is_random_access_iterator(i))//是否为随机迭代器
    {
        advance_RAI(i, n);
    }
    else if(is_bidirectional_iterrator(i))//是否为双向迭代器
    {
        advance_BI(i, n);
    }
    else
    {
        advance_II(i, n);
    }
}

为什么关心迭代器类型?
不同的迭代器类型对于数据的拷贝赋值方式不同,比如随机迭代器进行拷贝vector中的intPDO类型数据,只要利用首地址以及memcpy直接拷贝,如果为双向迭代器,则需要for循环进行赋值。

for循环和memcpy的区别:
for循环的做法:是把值从内存中拿入cpu,通过cpu放到需要所在空间(cpu作为中间桥梁进行数据的转移)
memcpy做法:使用协处理器不经过cpu直接把内存中的数据直接经过大块内存迁移,采用DMA(IO协处理器)方式memcpy的速度要远快于for循环。

template<class Category,class T,class Distance=int,
class Pointer = T*,class Reference = T&>//对于值类型

   struct iterator
   {
                 typedef Category iterator_category;//迭代器类型
                 typedef T        value_type;//值类型
                 typedef Distance difference_type;//差值类型
                 typedef Pointer  pointer;//指针类型
                 typedef Reference reference;//引用类型
   };

在这里插入图片描述
萃取器:
在这里插入图片描述
STL 中采取两种萃取方案:
(1)迭代器萃取
(2)值类型萃取
利用了部分特化的方式

   template<class Iterator>
   struct iterator_traits//迭代器类型萃取
   {
          typedef typename Iterator::iterator_category iterator_category;
          typedef typename Iterator::value_type        value_type;
          typedef typename Iterator::difference_type   difference_type;
          typedef typename Iterator::pointer           pointer;          
          typedef typename Iterator::reference         reference;
   };

   template<class T>//值类型萃取------原生普通指针
   struct iterator_traits<T*>
   {
          typedef random_access_iterator_tag iterator_category;
          typedef T        value_type;
          typedef int   difference_type;
          typedef T*          pointer;        
          typedef T&         reference;
   };

   template<class T>
   struct iterator_traits<const T*>//原生常指针
   {
          typedef random_access_iterator_tag iterator_category;
          typedef T        value_type;
          typedef int   difference_type;
          typedef const T*          pointer;        
          typedef const T&         reference;
   };

类型的部分特化,完全特化。

template <class T>//泛型---------所有类型
class Test
{
public:
    Test(){cout<< "T"<<endl;}
};
template <class T>
class Test<T*>//部分特化---是任意类型的指针
{
public:
    Test(){cout<< "T*"<<endl;}
};
template <class T>
class Test<char*>//完全特化-------必须是char类型的指针
{
public:
    Test(){cout<< "char*"<<endl;}
};
void main()
{
    Test<int> t1;
    Test<int*> t2;
    Test<char*> t3;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值