矢量定义为
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());
答案 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