如何在 Vector 实现中适当地使用 std::allocator<T>
How to use std::allocator<T> appropriately in Vector implementation
我正在尝试自己复制矢量实现,但我在分配器方面遇到了困难。
基本上我正在尝试使用 std::allocator 的 .allocate() 成员函数来分配一些内存而不构造任何东西但是我失败了。
这是给我带来麻烦的代码,我认为我做错了。对此有任何帮助将不胜感激。我注意到从参数中删除 const & 是有效的,但我仍然认为这不是正确的方法。
namespace container {
template<typename Type, typename Allocator = std::allocator<Type>>
class vector
{
private:
Type* m_vector;
std::size_t m_capacity{};
std::size_t m_size{};
public:
// Aliases
using size_type = std::size_t;
using init_list_type = std::initializer_list<Type>;
using reference = Type&;
using const_reference = const Type&;
using pointer = Type*;
using const_pointer = const Type*;
// Constructors
constexpr vector() noexcept : m_vector{ nullptr } {}
constexpr explicit vector(size_type length, const Allocator& allocator = Allocator()) // Here is the issue, this doesn't work if allocator is const&, but it works if it's not
: m_vector{ allocator.allocate(length) }, m_size{ length }, m_capacity{ length } {}
您应该在矢量对象中保留分配器的副本。您将需要在析构函数中使用它来释放在构造函数中分配的内存。
我正在尝试自己复制矢量实现,但我在分配器方面遇到了困难。 基本上我正在尝试使用 std::allocator 的 .allocate() 成员函数来分配一些内存而不构造任何东西但是我失败了。
这是给我带来麻烦的代码,我认为我做错了。对此有任何帮助将不胜感激。我注意到从参数中删除 const & 是有效的,但我仍然认为这不是正确的方法。
namespace container {
template<typename Type, typename Allocator = std::allocator<Type>>
class vector
{
private:
Type* m_vector;
std::size_t m_capacity{};
std::size_t m_size{};
public:
// Aliases
using size_type = std::size_t;
using init_list_type = std::initializer_list<Type>;
using reference = Type&;
using const_reference = const Type&;
using pointer = Type*;
using const_pointer = const Type*;
// Constructors
constexpr vector() noexcept : m_vector{ nullptr } {}
constexpr explicit vector(size_type length, const Allocator& allocator = Allocator()) // Here is the issue, this doesn't work if allocator is const&, but it works if it's not
: m_vector{ allocator.allocate(length) }, m_size{ length }, m_capacity{ length } {}
您应该在矢量对象中保留分配器的副本。您将需要在析构函数中使用它来释放在构造函数中分配的内存。