分配器作为向量和列表中的默认参数

allocator as default argument in vector and list

本文关键字:默认 参数 列表 向量 分配器      更新时间:2023-10-16

当我尝试使用像vector,list这样的顺序容器时,它将第二个默认参数显示为

typename _Ax = allocator <_Ty> >

我很想知道为什么在其他顺序容器中需要它,而在队列中却不需要它。这样做的确切目的是什么。

向致以最诚挚的问候

std::queue(类似于std::priority_queuestd::stack)是容器适配器,而不是容器。它采用的模板参数之一是一个容器:

template<
     class T,
     class Container = std::deque<T>
  > class queue;

队列在内部使用该容器–它基本上是一个围绕容器的包装器,提供了一个类似队列的接口。

容器(默认情况下是std::deque)当然有一个分配器参数,因为队列只是一个包装器,所以它显然使用了与容器相同的分配器。因此,队列的分配器参数隐含在其容器参数中。

分配器参数的目的是使用户能够定义针对当前用例优化的内存分配/释放方法(有时还有构造/销毁方法)。每当需要分配和解除分配时,标准分配器基本上将执行mallocfree(或等效的东西),这在某些情况下可能是不希望的。向它传递一个定制的分配器(例如Boost池分配器)可以提高效率,或者在其他方面很有用。

分配器处理给定容器(如std::vector)的所有内存分配和释放请求。

std::queue不是容器,它是一个容器适配器,充当底层容器的包装器。所以它不需要分配器,只有底层容器需要分配器。

template<class T, class Container = std::deque<T>> class queue;

std::stackstd::priority_queue是其他容器适配器