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,两种rend,resize(),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(), 5种insert(),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是一种双向开口的连续线性空间。可以在头尾两端分别做元素的插入和删除操作。Deque和vector的最大差异,一在于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()这两个操作,所以只有list和deque符合底层适配器。
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天后发布),欢迎加入(请扫二维码):