顺序容器容器适配器的模板定义


1)首先发表一下感概,看了一些顶层容器的实现过程,发现这些东西有着千丝万缕的联系,例如顺序中加载这一些容器适配器,在SGI中,Alloator这个底层的适配器算是最好的供应者。

2)模板定义之vector

template<class_Ty, class _A = allocator<_Ty> >

classvector {……} //VC源代码中截取了一部分模板定义

vector定义在<vector>的头文件中,在VS中的路径(默认情况下C:\ProgramFiles (x86)\Microsoft VisualStudio\VC98\Include),这个模板定义了两个参数类型,一个参数_Ty是保存的元素的类型,另一个参数为分配器(allocator).allocator指定了内存分配对象的类型,现在有个默认的底层allocator,当然用户可以自定义。(我们通过查看源代码可以看见在一些函数中也时可用到了allocation,例如vector构造函数,内存申请和释放的时候,通常会调用allocator

Vector中主要方法:

4个构造函数1个析构函数

赋值运算符=reverse()capacity(),两种begin(const和非const),两种end,两种rbegin,两种rendresize(),insert(), erase(), clear(), at(), push_back(), pop_back()等等。


3)模板定义之list

template<class_Ty, class _A = allocator<_Ty> >

classlist {….} VC源代码中截取了一部分模板定义

第一个参数表示保留的数据类型,第二个则是适配器。

STIlist定义在<list>头文件中,是一个标准的双向链表。具备前移和后移的能力。但是list不能像vector那样提供随机的访问,所以list迭代器之间不能进行加减操作和其他的指针运算。List中提供随机访问的只有front()back()方法,其他的数据的访问都必须通过迭代器。

主要方法:

5个构造,一个析构,begin(),end(), 5insert(),push_back(), pop_back(), push_front(), pop_front(), 2种形式的erase()clear().


3)模板定义之deque

template<class_Ty, class _A = allocator<_Ty> >

classdeque {…} //VC源代码中截取了一部分模板定义

这个不是经常使用,而是习惯性作为容器适配器的底层适配器。

Deque在头文件<deque>中,Deque是一种双向开口的连续线性空间。可以在头尾两端分别做元素的插入和删除操作。Dequevector的最大差异,一在于deque允许常数时间内对起头端进行元素的插入或者移除操作。二是deque没有所谓的容量,也的确是,它的内存管理和构造和vector完全不同。

主要方法:

4个构造,1个析构,有begin(),end(), operator[], front, back(), size(), max_size(), empty(),push_back(), pop_back(), push_front(), pop_front(), find()



4)模板定义之array

VS2008中没有array这个头文件,在C++11标准后,才有这个文件,没有看到源码,只是简单的将方法列出来。

这个类基本上和vector类似,只是它的大小是固定的,array的大小不能增加或者收缩,array支持随机访问迭代器,元素都保存在连续的内存单元。

支持的方法:

front(),back(), at(), operator[], fill(),不支持push_back(),pop_back(), clear(), resize(), capacity()等等


适配器:

适配器没有提供迭代功能,也没有提供同时插入或者删除多个元素的能力。


5)模板定义之queue

template<class_Ty, class _C = deque<_Ty> >

classqueue {…} VC源代码中截取了一部分模板定义

queue容器适配器定义在头文件<queue>中,queue提供了标准的先入先出语义,

_Ty参数保存了queue中的类型,第二个参数指定了queue适配器的底层容器,不过,由于queue要求顺序容器同时支持push_bcak()pop_back()这两个操作,所以只有listdeque符合底层适配器。

Queue支持的方法:

Size(),front(), pop(), push(),源代码也比较简单(没有考虑适配器的情况下)


6)模板定义之stack

template<class_Ty, class _C = deque<_Ty> >

classstack {…} // vc的部分源代码

stack在头文件<stack>中,stack是一种先进先出的数据结构,它只有一个出口,stack允许新增加元素,移出元素,取得元素最顶端。(没有其他办法取得其他元素)。可以看出这个类模板的参数类型也是使用底层的deque容器。

主要方法:

empty(), size(),两种top(), push() , pop()各类比较方法。

7)模板定义之priority_queue

此类使用和queue基本差不多,就是多了一个优先级的区别。


8)模板定义之bitset

template<size_t_N>

classbitset {….} //这个算是最简单的模板定义了 简单了设置了一个数值型的数字


bitset在头文件<bitset>中,默认的初始化为0.

它的主要方法有:

Set(), reset(), flip(), operator[], test(),

现在简单的给出一个编程实例:(原来自己没有用过的类)

#include"stdafx.h"

#include<bitset>

#include<iostream>

usingnamespacestd;


int_tmain(intargc,_TCHAR*argv[])

{

bitset<10>bit;

bit.set(1);

bit.set(3);

bit[5]=true;

bit[7]=bit[1];

cout<<bit<<endl;//从右往左数的


//bitset还实现了比较牛逼的功能| & ^ ~ >> << &= |= ^= <<= >>=等符号的重载


bitset<10>bit1;

bit1.set(1);

bit1.set(3);

bit1.set(7);

bit[4]=true;

cout<<bit1<<endl;//从右往左数的


bit&=bit1;

cout<<bit<<endl;

getchar();

return0;

}



到此,顺序容器和容器适配器的简单模板定义介绍达此。

欢迎加入Jack_Li的金融交易-知识星球,这里有高大上的金融业务学习和编程知识学习,让你掌握时下最火爆的两门top行业信息,在这里你可以获得Jack_Li的经验,获得Jack_Li同学的内部推荐(证券公司,基金公司,大型金融机构等,入圈5天后发布),欢迎加入(请扫二维码):




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值