C ++ логическая ошибка с использованием динамических массивов - PullRequest
0 голосов
/ 14 сентября 2018

Внутри функции insert я использую динамическое выделение памяти с массивами ditems и tempItems .

Где я использую tempItems , чтобы быть массивом, вдвое большим, чем ditems , а также временно хранить все элементы из 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 голосов
/ 14 сентября 2018

Перемещение массива на новую позицию делает недействительным итератор 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;
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...