C++ 使用默认值初始化数组 class

C++ initialize array class with default value

我想创建一个开放哈希 table。 我想使用列表数组,其中数组的大小是模板参数,但问题是我不知道如何将分配器传递给所有列表实例,而且我不能使用向量,因为我将需要另一个分配器来分配列表(allocception),有没有办法用相同的值初始化整个列表数组? 我知道我可以像这样初始化 list<int> mylist[] = {{allocator}, {allocator}, {allocator}}

但想法是将大小作为模板变量。 示例:

template<typename KEY, typename VAL, typename ALLOC=std::allocator<struct _internal>, size_t TBL_SIZE=100>
class open_hash_table{
private: 
   std::list<struct _internal, ALLOC=ALLOC> _table[TBL_SIZE];
public: 
    open_hash_table(ALLOC allocator=ALLOC())
    :_table({allocator, allocator ... allocator}){}
};

P.s。我的编译器最多支持 c++11

这将 C++14 用于 std::make_index_sequence and the std::index_sequence it produces but you can make your own implementation as shown here. Using a delegating constructor 您可以添加另一个构造函数,该构造函数采用 index_sequence 这样您就可以扩展序列并获得可变值列表,例如

template<typename KEY, typename VAL, typename ALLOC=std::allocator<struct _internal>, size_t TBL_SIZE=100>
class open_hash_table{
private: 
    std::list<struct _internal, ALLOC> _table[TBL_SIZE];
    template <std::size_t... Is>
    open_hash_table(ALLOC allocator, std::index_sequence<Is...>) 
    : _table{ std::list<struct _internal, ALLOC>{((void)Is, allocator)}... } {}
public: 
    open_hash_table(ALLOC allocator=ALLOC())
    : open_hash_table(allocator, std::make_index_sequence<TBL_SIZE>{}) {}
};

您的 public 构造函数将调用私有辅助构造函数并传递一个 index_sequence,其中将包含 TBL_SIZE 个元素。然后在委托构造函数中,((void)Is, allocator) 部分使用逗号运算符来使用 index_sequence 的每个元素,但我们将其丢弃,而是让表达式解析为 allocator(void)Is 部分将 Is 的结果转换为 void 以抑制它未被使用。我们也必须使用 std::list<struct _internal, ALLOC>{ ... } 因为接受分配器的构造函数是 explicit 所以需要指定类型,不允许隐式转换。

可以通过一些元编程技术直接在成员初始化列表中初始化_table,但是由于TBL_SIZE的默认值是100,这将使compile-time 开销略大。仅默认构造 _table 并在构造函数主体中初始化其值更合适。

并且由于 TBL_SIZE 是一个 compile-time 常量,您可以只使用 std::array:

而不是使用原始数组
template<typename KEY, typename VAL, typename ALLOC=std::allocator<_internal>, size_t TBL_SIZE=100>
class open_hash_table{
private:
  std::array<std::list<_internal, ALLOC>, TBL_SIZE> _table;
public:
  open_hash_table(ALLOC allocator=ALLOC()) {
    _table.fill(std::list<_internal, ALLOC>(allocator));
  }
};

此外,由于这是 C++,struct _internal 中的 struct 关键字是不必要的。