首页 > 解决方案 > 自定义 std::allocator_traits::construct

问题描述

我想自定义std::vector行为以不默认构造元素类型(例如int),因为对于大型向量执行此操作很昂贵。

看着这个,我能看到的唯一方法就是专业化std::allocator_traits<MyAllocator>::construct。但是,这似乎是不可能的,因为特化必须与原始声明在同一个命名空间中。

投入专业化namespace std似乎并不正确。它实际上比这更糟糕,因为我使用的 STL 实现实际上放入std::allocator_traitsnamespace std::__u(而且这肯定会因 STL 实现而异),所以这样做似乎是非常错误的。

这令人困惑,因为似乎 std::allocator_traits 旨在允许专业化,但我无法弄清楚如何实际做到这一点。这只是一个坏主意吗?如果是这样,是否有其他方法可以解决问题(避免在 STL 容器中默认构造元素)?

标签: c++stlallocator

解决方案


不仅允许专门化标准库特征类,而且是提供此类功能的主要方式。但是,在这种特殊情况下,这是不必要的。

默认std::allocator_traits<T>::construct实现(T您的分配器类型在哪里,而不是正在使用的容器的值类型)将调用if的construct成员函数具有这样的功能,并且它调用放置 -如果没有适当的成员。所以只需给你的分配器一个成员,你应该没问题。TTnewTconstruct


推荐阅读