新的C ++ 11标准要求STL实现支持容器中的有状态分配器。主STL实现(Visual Studio 2008,2010,libstdc ++)现在是否符合此要求?我在MSDN或libstdc ++文档中找不到任何相关内容。
答案 0 :(得分:15)
看起来STL容器中的有状态分配器的功能已经得到广泛支持。在大多数情况下,分配器的完整性不会造成麻烦。尚未广泛支持的是新标准处理有问题情况的方式(交换容器(是否交换分配器),列表拼接)。
在大多数当前标准库的代码中(包括MS使用的Dinkumware),支持有状态分配器
This tread(libstdc ++,2004)说(如果我理解正确的话):
我们已经支持
l1.get_allocator() != l2.get_allocator()
的分配器。我们不做的是制定任何特殊条款,以便在splice()
和swap()
中检测这些分配器。
This blog entry(libstdc ++,2009)说:
C ++ 0x模式下的现有容器现在与有状态分配器一起使用效率更高(即,在元素构造时不会动态创建分配器)。
This document说新的libc++ library:
所有容器都满足所有最新的分配器要求 它完全支持有状态分配器。 - 无状态分配器的空间被优化掉了。
EASTL支持有状态分配器。
This thread包含有关此功能的便携性的有趣争议。
因此大多数STL实现都支持statefull分配器,这意味着它们不会在底层创建分配器类型的其他实例,而是存储客户端提供的分配器实例,并且所有分配/解除分配都是通过它完成的。但是,他们处理swap
ping和list::splice
的方式没有记录,不可移植。
更新:VS2008的STL要求分配器具有模板化复制构造函数,IMO最不可能使用自定义分配器:简单的隔离存储。
对于对STL中有状态分配器的当前状态不满意的人,我建议考虑Boost.Intrusive
和Boost.Container
。
答案 1 :(得分:3)
g ++ does not支持作用域分配器。
VS2010支持某些非标准分配器but not apparently the standard ones