gpt4 book ai didi

c++ - 实现具有迭代器支持的通用固定大小数组

转载 作者:行者123 更新时间:2023-11-27 22:32:07 25 4
gpt4 key购买 nike

我需要一个在编译时大小已知的数组。我知道我可以使用 std::vectorboost::array。但这并没有告诉我它在内部是如何工作的。此外,除了使用初始值设定项之外,我找不到如何将项目添加到 boost::array 中。我为通用数组编写了以下代码。我的目的是熟悉迭代器、模板特化等。下面是代码

template<typename T>
struct iterator_traits
{
typedef T value_type;
typedef T& reference_type;
typedef T* iterator;
typedef const T* const_iterator;
typedef std::reverse_iterator<iterator> reverse_iterator;
};

template<typename T>
struct iterator_traits<T*>
{
typedef T* value_type;
typedef T*& reference_type;
typedef T** iterator;
typedef const T const_iterator;
typedef std::reverse_iterator<iterator> reverse_iterator;
};

template<typename T, size_t size = 10>
class Array
{
public:

typedef typename iterator_traits<T>::value_type value_type;
typedef typename iterator_traits<T>::reference_type reference_type;
typedef typename iterator_traits<T>::iterator iterator;
typedef typename iterator_traits<T>::const_iterator const_iterator;
typedef typename iterator_traits<T>::reverse_iterator reverse_iterator;

Array() : lastIndex(0) {
}

void add(value_type element) {
if(lastIndex >= size)
throw std::out_of_range("Array is full");
array_[lastIndex++] = element;
}

reference_type at(unsigned int index){
if(index < size)
return array_[index];
else
throw std::out_of_range("Invalid index");
}

size_t capacity(){
return size;
}

iterator begin(){
return array_;
}

iterator end(){
return array_ + size;
}

const_iterator begin() const{
return array_;
}

const_iterator end() const{
return array_ + size;
}

reverse_iterator rbegin() {
return reverse_iterator(end());
}

reverse_iterator rend() {
return reverse_iterator(begin());
}

private:

value_type array_[size];
unsigned int lastIndex;
};

上面的代码运行良好。以下是我的问题

1 - 如何创建像 boost::array 那样的数组?有点像

Array<int> ints = { 10, 12 };

2 - 代码中是否存在任何缺陷?

3 - 我必须对特征中的指针类型使用专门化。这是最佳做法吗?

4 - 迭代器模式是否正确实现?

任何想法都会很棒!

最佳答案

1 - 我怎样才能像 boost::array 那样创建我的数组?有点像

Array<int> ints = { 10, 12 };

在 C++ 中,如果您的结构、 union 或 C 风格的数组满足成为聚合的条件,您只能(目前)使用大括号括起来的初始化列表。为此,根据标准:

8.5.1.1 聚合是一个数组或类(第 9 条),没有用户提供的构造函数(12.1),没有私有(private)或 protected 非静态数据成员(第 11 条),没有基类(第 10 条),并且没有虚函数 (10.3)。

如果您想在当前标准中使用这些功能,则必须让您的类具有这些功能。下一个标准(参见 here )包括允许其他类型这样做的条款。

2 - 代码中是否存在任何缺陷?

这是一个:您不能将内容添加到提升列表的原因是它始终具有相同数量的元素(分配给它的大小)。在您的阵列中,您可以添加元素,但在构造过程中您仍然在引擎盖下构造了 10 个元素。如果用户不期望调用 10 次的默认构造函数,这可能会导致一些令人惊讶的结果。

关于c++ - 实现具有迭代器支持的通用固定大小数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1053678/

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