Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> собственный клас вектор 
V
    Опции темы
toxx
Дата 31.3.2010, 18:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 653
Регистрация: 4.3.2009
Где: НН

Репутация: 4
Всего: 13



Решил написать хотя бы похожий на класс вектор свой класс
Код

template <class T>
class Vector
{
    T* V;
    int n;
public:
    Vector(int=0);
    Vector(const Vector&);
    int size(){return n;}
    int begin(){return 0;}
    int end(){return n;}
    void resize(int);
    Vector& erase(int);
    ~Vector(){delete[] V;}
    T& operator[](int i){return V[i];}
};

Хочется узнать, что нужно еще сделать, чтобы метод erase() был похож на erase() из вектора.
Просто,работая с деревом(тема)
При замене на свой вектор появляются многочисленные ошибки памяти(bad_alloc и другие)
erase
Код

template <class T>
Vector<T>& Vector<T> ::erase(int k)
{
    k-=1;
    Vector<T> buf=*this;
    for(int i=0;i<n;i++)
    {
        if(i!=k)V[i]=buf[i];
        else 
        {
            V[i]=buf[i+1];
            k++;
        }
    }
    n-=1;
    V=new T[n];
    for(int i=0;i<n;i++)
        V[i]=buf[i];
    return *this;
}

конструктор копировщик
Код

Vector<T>::Vector(const Vector& Vect)
{
    n=Vect.n;
    V=new T[n];
    for(int i=0;i<n;i++)
        V[i]=Vect.V[i];
}



Это сообщение отредактировал(а) toxx - 1.4.2010, 17:47
PM MAIL   Вверх
ИванМ
Дата 31.3.2010, 20:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1260
Регистрация: 19.6.2006
Где: СПб

Репутация: 3
Всего: 23



что делает твой метод erase я так и не понял, а конструктор копирования вроде правильный
PM MAIL   Вверх
toxx
Дата 31.3.2010, 20:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 653
Регистрация: 4.3.2009
Где: НН

Репутация: 4
Всего: 13



Цитата(ИванМ @ 31.3.2010,  20:15)
что делает твой метод erase я так и не понял, а конструктор копирования вроде правильный

По идее должен удалять к-й элемент массива, нумерация 1 2 ...
PM MAIL   Вверх
ИванМ
Дата 31.3.2010, 20:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1260
Регистрация: 19.6.2006
Где: СПб

Репутация: 3
Всего: 23



Цитата(toxx @  31.3.2010,  18:40 Найти цитируемый пост)
for(int i=0;i<n;i++)
    {
        if(i!=k)V[i]=buf[i];
        else 
        {
            V[i]=buf[i+1];
            k++;
        }
    }

зачем нужен весь этот код если потом ты массив V все равно пересоздаешь, причем не удаляя старый вариант.

Цитата(toxx @  31.3.2010,  18:40 Найти цитируемый пост)
V=new T[n];


PM MAIL   Вверх
toxx
Дата 31.3.2010, 20:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 653
Регистрация: 4.3.2009
Где: НН

Репутация: 4
Всего: 13



ИванМ
Ну я перекопировал элементы старого массива 
потом уменьшил размерность старого массива
Код

 n-=1;

И перекопирую уже в новый
Может быть так лучше будет, с точки зрения вашего совета?
Код

Vector<T>& Vector<T> ::erase(int k)
{
    k-=1;
    Vector<T> buf=*this;
    for(int i=0;i<n;i++)
    {
        if(i!=k)V[i]=buf[i];
        else 
        {
            V[i]=buf[i+1];
            k++;
        }
    }
    n-=1;
    delete(V);
    V=new T[n];
    for(int i=0;i<n;i++)
        V[i]=buf[i];
    delete(buf);
    buf=NULL;
    return *this;
}

Чето намудрил с operator delete он отказывается удалять )

Это сообщение отредактировал(а) toxx - 31.3.2010, 20:39
PM MAIL   Вверх
ИванМ
Дата 31.3.2010, 20:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1260
Регистрация: 19.6.2006
Где: СПб

Репутация: 3
Всего: 23



toxx, ты перекопировал элементы массива V из объекта buf  в объект this странным кривым образом, а потом еще вдобавок удалил весь массив V объекта this и заново его создал. зачем тогда вообще предыдущая операция была нужна?

Добавлено через 1 минуту и 46 секунд
Цитата(toxx @  31.3.2010,  20:32 Найти цитируемый пост)
delete(buf);
    buf=NULL;

и это что означает? delete это операция, применимая к указателю, а не значению. и к нулю твой тип приравнять нельзя. 
PM MAIL   Вверх
toxx
Дата 31.3.2010, 20:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 653
Регистрация: 4.3.2009
Где: НН

Репутация: 4
Всего: 13



ой, понял что вы имеете ввиду только со 2го раза, вот сделал вродебы
Код

Vector<T>& Vector<T> ::erase(int k)
{
    k-=1;
    Vector<T> buf=*this;
    for(int i=0;i<n;i++)
    {
        if(i!=k)V[i]=buf[i];
        else 
        {
            buf[i]=V[i+1];
            k++;
        }
    }
    n-=1;
    //
    delete V;
    V=new T[n];
    for(int i=0;i<n;i++)
        V[i]=buf[i];
    //delete buf;
    //buf=NULL;
    return *this;
}


Да, вот с этим
Код

delete(buf);
    buf=NULL;


проблема, щас переделываю...
PM MAIL   Вверх
ИванМ
Дата 31.3.2010, 21:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1260
Регистрация: 19.6.2006
Где: СПб

Репутация: 3
Всего: 23



toxx, нет, вы так ничего и не поняли. Остальной код вы сами писали? Странно, если сами.
PM MAIL   Вверх
toxx
Дата 31.3.2010, 22:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 653
Регистрация: 4.3.2009
Где: НН

Репутация: 4
Всего: 13



Цитата(ИванМ @ 31.3.2010,  21:52)
toxx, нет, вы так ничего и не поняли. Остальной код вы сами писали? Странно, если сами.

Код

Vector<T>& Vector<T> ::erase(int k)
{
    k-=1;
    Vector buf=*this;
    for(int i=0;i<n;i++)
    {
        if(i!=k)buf[i]=V[i];
        else 
        {
            buf[i]=V[i+1];
            k++;
        }
    }
    n-=1;
    delete V;
    V=new T[n];
    for(int i=0;i<n;i++)
        V[i]=buf[i];
    return *this;
}


Все писал сам, в книге только структура дана была и конструктор(не копировщик).
Я просто этим первый раз занимаюсь, отсюда такие проблемы.
может быть вы имели ввиду вот эту строчку:
Код

Vector buf=*this;

я уже не знаю почему я не правильно вас понял...

Это сообщение отредактировал(а) toxx - 31.3.2010, 23:07
PM MAIL   Вверх
ИванМ
Дата 1.4.2010, 15:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1260
Регистрация: 19.6.2006
Где: СПб

Репутация: 3
Всего: 23



Давайте я вам напишу алгоритм по шагам.
1 пункт у вас правильный: создаете копию этого объекта this.
Код

Vector buf=*this;

2 пункт. Сдвигаете элементы созданного вектора buf влево, начиная с нужного символа (не забывая, что нельзя выходить за границу массива, это у вас не предусмотрено)
3 пункт. Удаляете массив вектора this и создаете его заново, с кол-вом элементов меньшим на единицу
можно как у вас
Код

n-=1;
    delete V;
    V=new T[n];

4 пункт. Копируете элементы из измененного вектора buf в массив вектора this, исключая последний элемент в buf
Вот и все. А у вас там каша какая-то

PM MAIL   Вверх
toxx
Дата 1.4.2010, 16:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 653
Регистрация: 4.3.2009
Где: НН

Репутация: 4
Всего: 13



Цитата

4 пункт. Копируете элементы из измененного вектора buf в массив вектора this, исключая последний элемент в buf
Вот и все. А у вас там каша какая-то


Я вродебы таким вот образом скопировал элементы buf в массив V( как я понял V, это и есть this?)
Код

for(int i=0;i<n;i++)
    V[i]=buf[i];


Или нужно писать вместо моего копирования
Код

..............................
    for(int i=0;i<n;i++)
        V[i]=buf[i];
    return *this;
}

вот это
Код

.............................
for(int i=0;i<n;i++)
    (this*)[i]=buf[i];
}




Это сообщение отредактировал(а) toxx - 1.4.2010, 16:17
PM MAIL   Вверх
ИванМ
Дата 1.4.2010, 16:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1260
Регистрация: 19.6.2006
Где: СПб

Репутация: 3
Всего: 23



не заметил последний исправленный вариант
если вот этот участок подправить, то все будет хорошо:
Цитата(toxx @  31.3.2010,  22:59 Найти цитируемый пост)
 for(int i=0;i<n;i++)
    {
        if(i!=k)buf[i]=V[i];
        else 
        {
            buf[i]=V[i+1];
            k++;
        }
    }


PM MAIL   Вверх
toxx
Дата 1.4.2010, 16:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 653
Регистрация: 4.3.2009
Где: НН

Репутация: 4
Всего: 13



Добавил условие выхода за границу массива
Код

for(int i=0;i<n;i++)
{
    if(i!=k)buf[i]=V[i];
    else if((i+1)<n)
    {
        buf[i]=V[i+1];
        k++;
    }
}

В итоге должно быть что-то такое?
Код

Vector<T>& Vector<T> ::erase(int k)
{
    k--;
    if(k>=n) 
    {
        cout<<"out of range"<<endl;
        return *this;
    }
    Vector buf=*this;
    for(int i=0;i<n;i++)
    {
        if(i!=k)buf[i]=V[i];
        else if((i+1) <n)
        {
            buf[i]=V[i+1];
            k++;
        }
    }
    n--;
    delete V;
    V=new T[n];
    for(int i=0;i<n;i++)
        (*this)[i]=buf[i];
}


Это сообщение отредактировал(а) toxx - 1.4.2010, 16:55
PM MAIL   Вверх
ИванМ
Дата 1.4.2010, 16:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1260
Регистрация: 19.6.2006
Где: СПб

Репутация: 3
Всего: 23



все гораздо проще. на этом этапе можно обойтись с одним объектом - buf
просто проходите по элементам buf по циклу начиная с k и заканчивая n-2
и приравниваете текущей элемент следующему
и все
PM MAIL   Вверх
toxx
Дата 1.4.2010, 17:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 653
Регистрация: 4.3.2009
Где: НН

Репутация: 4
Всего: 13



Цитата(ИванМ @ 1.4.2010,  16:39)
все гораздо проще. на этом этапе можно обойтись с одним объектом - buf
просто проходите по элементам buf по циклу начиная с k и заканчивая n-2
и приравниваете текущей элемент следующему
и все

Вот что получил функция значительно уменьшилась...
Код

Vector<T>& Vector<T> ::erase(int k)
{
    if(k>=n||k<0) 
    {
        cout<<"index out of range"<<endl;
        return *this;
    }
    Vector buf=*this;
    n--;
    delete V;
    V=new T[n];
    for(int i=0;i<n;i++)
    if(i!=k)(*this)[i]=buf[i];
    else 
    {
        (*this)[i]=buf[i+1];
        k++;
    }
}


Это сообщение отредактировал(а) toxx - 1.4.2010, 17:11
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0575 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.