使用动态数组的C ++逻辑错误

时间:2018-09-14 13:23:18

标签: c++ arrays dynamic

插入函数中,我对数组 ditems tempItems 使用动态内存分配。

我在使用 tempItems 作为数组的大小是 ditems 的两倍,并且还存储了来自 ditems 的所有项目;然后删除并分配与 tempItems

相等的图元

代码可以很好地执行代码,但是当使用足够的数据测试需要 ditems 来存储2000个元素时,看来 ditems 数组并没有变得更大。如果我要在构造函数中设置(arrayCap = 2001;),那么就没有问题。

对于使用动态数组和使用动态数组查看其他代码,我是陌生的,看起来我没有犯任何错误。我不能将向量用于此任务,因此我陷入了动态数组的困境,但是我不确定这里出了什么问题。

template <class T>
class Vector {
    public:
        typedef T* iterator;
        Vector () { 
            arrayCap=1000;
            ditems = new T[arrayCap];
        }

        T& operator[](unsigned int i) {
           return ditems[i];
        }

        iterator begin () {
            used=0;
            return &ditems[used];
        }
        iterator end () { 
            return &ditems[used];
        }
        int size () { return used; }
        void deletes(){

            used--;

        }

        iterator insert (iterator position, const T& item) { 

            if(arrayCap-used<100)
            {
                temp=arrayCap;
                arrayCap=2*arrayCap;

                tempItems=new T[arrayCap];
                for(int i=0; i<temp;i++)
                {
                    tempItems[i]= ditems[i];
                }
                delete [] ditems;
               ditems=tempItems;  
            }

            for(Vector<T>::iterator i=&ditems[arrayCap-1]; i>position; i--)
            {
               *i=*(i-1);
            }
            used++;
            *position= item;
            return position;
        }
    private:
        int arrayCap,temp;
        T *ditems;
        T *tempItems;
        int used;

};

1 个答案:

答案 0 :(得分:2)

将数组移到新位置会使迭代器position无效,它指向旧数组。因此i>position是未定义的行为。

您应该在移动数组之前计算索引,并在新数组的索引处设置position

template <class T>
class Vector {
    public:
        typedef T* iterator;
        Vector () { 
            arrayCap=1000;
            ditems = new T[arrayCap];
            used = 0;
        }

        T& operator[](unsigned int i) {
           return ditems[i];
        }

        iterator begin () {
            return ditems;
        }
        iterator end () { 
            return &ditems[used];
        }
        int size () { return used; }
        void deletes(){
            used--;
        }

        iterator insert (iterator position, const T& item) { 

            if(arrayCap-used<100)
            {
                auto temp=arrayCap;
                arrayCap*=2;
                auto index = position - ditems;

                auto tempItems=new T[arrayCap];
                for(int i=0; i<temp;i++)
                {
                    tempItems[i]= ditems[i];
                }
                delete [] ditems;
                ditems = tempItems;
                position = ditems + index;
            }

            for(Vector<T>::iterator i=&ditems[arrayCap-1]; i>position; i--)
            {
               *i=*(i-1);
            }
            used++;
            *position = item;
            return position;
        }
    private:
        int arrayCap;
        T *ditems;
        int used;
};