为什么在构造函数中使用allocator?

时间:2013-09-25 07:45:11

标签: c++ vector

矢量定义为

template < class T, class Alloc = allocator<T> > class vector;

每个向量构造函数(或每种类型的一个重载)都有一个allocator重载,默认构造函数也有一个。已在类模板中指定了分配器。什么是构造函数分配器?

来自http://www.cplusplus.com/reference/vector/vector/vector/

default (1) 

explicit vector (const allocator_type& alloc = allocator_type());

fill (2)    

explicit vector (size_type n);
         vector (size_type n, const value_type& val,
                 const allocator_type& alloc = allocator_type());

range (3)   

template <class InputIterator>
  vector (InputIterator first, InputIterator last,
          const allocator_type& alloc = allocator_type());

copy (4)    

vector (const vector& x);
vector (const vector& x, const allocator_type& alloc);

move (5)    

vector (vector&& x);
vector (vector&& x, const allocator_type& alloc);

initializer list (6)    

vector (initializer_list<value_type> il,
       const allocator_type& alloc = allocator_type());

2 个答案:

答案 0 :(得分:2)

模板括号中的参数是分配器的类型(类)。构造函数的参数是该类型的实例。

答案 1 :(得分:0)

根据this对Alex Stepanov的采访(该论文发表在1995年3月的Dobb博士杂志上)中,分配器是需要适应不同内存模型的结果。用16位代码处理x86内存相当奇怪,您可以使用大约5种不同的内存模型来实现。

人们想要的容器与内存模型无关,这有点多余,因为该语言不包含内存模型。人们希望该库提供某种抽象内存模型的机制。 STL的早期版本假定容器的大小可表示为size_t类型的整数,并且两个迭代器之间的距离为ptrdiff_t类型。现在我们被告知,为什么不从中抽象出来?这是一个很高的要求,因为该语言并未从中抽象出来。 C和C ++数组未由这些类型参数化。我们发明了一种称为“分配器”的机制,该机制封装了有关内存模型的信息。这给库中的每个组件造成了严重的后果。您可能想知道内存模型与算法或容器接口有什么关系。如果不能使用size_t之类的内容,则由于指针类型不同(T *,T huge *等),您也不能使用T *之类的东西。然后,您将无法使用引用,因为对于不同的内存模型,您将具有不同的引用类型。图书馆产生了巨大的影响。 -Alex Stepanov