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

标签 c++ arrays templates iterator

我需要一个在编译时大小已知的数组。我知道我可以使用 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/

相关文章:

c++ - 如何在 SQLite 数据库中存储枚举

c++ - 将字母表示为 2 位数字,将大数字转换为单词

java - 应用 Array.sort() 函数后数组元素变为 0

c - C 中静态分配数组大小的限制

java - 对三个整数进行排序

c++ - 单引号防止 bindValue 替换占位符标记

c++ - OpenCL 内核浮点除法给出不同的结果

c++ - gcc 编译器标志以抑制编译期间模板错误的模板扩展?

c++ - C++ 模板中不能接受返回参数

c++ - 模板结构错误