【问题标题】:why allocator in constructor?为什么在构造函数中分配器?
【发布时间】:2013-09-25 07:45:10
【问题描述】:

一个向量被定义为

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());

【问题讨论】:

  • 它允许你传递一个分配器的特定实例。
  • @juanchopanza:当使用类模板析构函数的向量析构函数被调用时,它不会中断吗?
  • 我看不出它为什么会坏掉。标准库容器的设计不是那么容易损坏。

标签: c++ vector


【解决方案1】:

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

【讨论】:

  • 哦!我现在看到了,它在那里使用类而不是特定实例。当他们可以在模板中提供实例时,这有点奇怪
  • @user2814152:不,他们不能。该语言不允许将任意对象作为模板参数传递。
  • 我不是指实例。像 int 这里的东西stackoverflow.com/questions/3082113/…
  • @user2814152:我知道你的意思。只有类型和整数常量可以作为模板参数传递,而不是任意类型的对象。
  • 写完后我相信我希望它是written like this。现在我试图理解为什么它不是和谷歌搜索分配器教程
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-22
    • 1970-01-01
    • 2016-01-07
    • 1970-01-01
    • 2017-11-25
    • 1970-01-01
    相关资源
    最近更新 更多