1

一个向量被定义为

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

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

来自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());
4

2 回答 2

2

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

于 2013-09-25T07:47:00.983 回答
0

根据1995 年 3 月的 Dobb 博士期刊上对 Alex Stepanov 的采访,分配器是需要适应不同的内存模型的结果使用 16 位代码寻址 x86 内存相当奇怪,您可以使用 5 种不同的内存模型来实现它。

人们希望容器独立于内存模型,这有点过分,因为该语言不包含内存模型。人们希望该库提供一些抽象内存模型的机制。早期版本的 STL 假定容器的大小可以表示为 size_t 类型的整数,并且两个迭代器之间的距离是 ptrdiff_t 类型。现在我们被告知,你为什么不从中抽象出来?这是一项艰巨的任务,因为语言并没有从中抽象出来。C 和 C++ 数组没有被这些类型参数化。我们发明了一种称为“分配器”的机制,它封装了有关内存模型的信息。这对库中的每个组件都造成了严重后果。您可能想知道内存模型与算法或容器接口有什么关系。如果你不能使用 size_t 之类的东西,你也不能使用 T* 之类的东西,因为指针类型不同(T*、T huge * 等)。然后你不能使用引用,因为不同的内存模型你有不同的引用类型。图书馆产生了巨大的影响。- 亚历克斯·斯捷潘诺夫

于 2020-02-26T20:58:01.387 回答