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
关键字是不必要的。
我想创建一个开放哈希 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
关键字是不必要的。