gpt4 book ai didi

c++ - 来自 initializer_list 的构造函数

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:13:06 24 4
gpt4 key购买 nike

我正在用 C++ 实现一个容器,实际上是一个数组的包装器。我不确定如何从 initializer_list 实现构造函数。我最终得到了这个实现,但在我看来真的很难看。因此可以是在由 initializer_list 初始化的堆中分配的数组。还是有一种优雅的方式来做到这一点?

template <typename T> class sequence {
public:
sequence (size_t n): _data {new T[n]}, _size {n} {};
sequence (std::initializer_list<T> source);
~sequence() { delete[] _data; };
private:
pointer _data;
size_type _size;
};

//Initializer list constructor
template <class T> sequence<T>::sequence (std::initializer_list<T> source)
: sequence(source.size()) {
auto iterator = source.begin();
for ( int i=0; i < _size; i++) {
_data[i] = *iterator;
++iterator;
}
};

最佳答案

取决于您要做什么。

如果您确实需要使用在编译时确定的大小有界的序列,请使用 std::array<T,std::size_t> ,它是在 C++11 中引入的 C 风格数组的包装器(就像您正在实现的那样)。

但是,正如您在其中一条评论中所说,您这样做主要是出于教育目的。在那种情况下,您拥有的是体面的。语法可以稍微清理一下。考虑:

//Initializer list constructor
template <class T>
sequence<T>::sequence (std::initializer_list<T> source)
: sequence(source.size())
{
auto it = source.begin();
auto const e = source.cend();
auto d = data_;
while (it != e) {
*d++ = *it++;
}
};

这样你就不会明确依赖 size() .您可以考虑通过转动 it 来提高效率。和 e迭代器变成“移动”迭代器:

auto it = std::make_move_iterator(source.begin());
auto e = std::make_move_iterator(source.end());

这样,无论何时取消引用,它的值都会被转换为右值引用,从而允许移动赋值。

关于c++ - 来自 initializer_list 的构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37682360/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com