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

Поиск:

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


Опытный
**


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

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



Хммм... компилятор перестал выдавать ошибки crtexe.c 
я уже даже вектор нарисовал на бумажке до и после увеличения для:
Код

Vector<int> y(4);
y.resize(10);
нет ничего криминального, даже компилятор за !

Код

void Vector<T>::resize(size_t new_size)
{
    if(capacity<new_size&&n<new_size)
    {
        Vector buf(new_size);
        if(new_size>capacity)
            capacity=new_size*2;

        for(size_t i=0;i<n;i++)
            buf[i]=(*this)[i];

        delete[] V;
        n=new_size;
        V=new T[capacity];
        buf.swap(*this);
    }
}

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


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(toxx @  3.4.2010,  21:43 Найти цитируемый пост)
нет ничего криминального, даже компилятор за !

компилятор проверяет корректность , а не логичность.. 
smile

Цитата(toxx @  3.4.2010,  21:43 Найти цитируемый пост)
  if(capacity<new_size&&n<new_size) // не кажется что у обоих условий должна быть своя логика обработки ?
    {
        Vector buf(new_size); // а в конструкторе вызывается resize ? не боитесь  рекурсии ?

        if(new_size>capacity) 
            capacity=new_size*2; // а зачем изменять переменную текущего вектора ?

        for(size_t i=0;i<n;i++)
            buf[i]=(*this)[i];  // ну копирование пойдет.. 

        delete[] V;        // а тут зачем удаление ?
        n=new_size;   
        V=new T[capacity]; // и создаете новый ? может вместо этих двух операций достаточно swapa ?
        buf.swap(*this); 
    }




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


Опытный
**


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

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



Код

template <class T>
void Vector<T>::resize(size_t new_size)
{
    if(capacity<new_size&&n<new_size)
    {
        Vector buf(new_size);
        if(new_size>capacity)
            capacity=new_size*2;

        for(size_t i=0;i<n;i++)
            buf[i]=(*this)[i];

        buf.swap(*this);
    }
}

Как сложно делать вещи логичными оказывается....

1.тут я делаю чтобы ёмкость у изменяемого вектора была new_size*2;
Код

if(new_size>capacity)
    capacity=new_size*2;

2.Так вродебы это не прямая рекурсия, а косвенная...какие слова я знаю ухх
3.Пока я был уверен что я прав в предыдущем посте... набросал функцию push_back(уже боюсь что тут что-то я не логично сделал, но я старался быть таковым)
Код

void Vector<T> ::push_back(T k)
{
    Vector buf=*this;
    n++;
    delete []V;
    V=new T[n];
    for(size_t i=0;i<n;i++)
    if(i==(n-1))(*this)[i]=k;
        else (*this)[i]=buf[i];
}

4.Мне нужна будет сортировка массива, вношу быструю сортировку с разделением
Код

void Vector<T>::sort(size_t First,size_t Last)
{
    size_t i=First,j=Last;
    T mid,x;
    mid=(First+Last)/2;
    x=V[mid];
    do
    {
        while(V[i]>x)
        {
            i++;
            while(x>V[j])
            {
                j++;
                if(i<=j)
                {
                    T tmp;
                    tmp=V[i];
                    V[i]=V[j];
                    V[j]=tmp;
                    i++;
                    j--;
                }
            }
        }
    }
    while(i>j);

    if(First<j) sort(First,j);
    if(i<Last) sort(i,Last);
}


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


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(toxx @  3.4.2010,  22:50 Найти цитируемый пост)
набросал функцию push_back(

что за удаление/создание внутри push_backa?  smile

Добавлено через 7 минут и 40 секунд
Цитата(toxx @  3.4.2010,  22:50 Найти цитируемый пост)
1.тут я делаю чтобы ёмкость у изменяемого вектора была new_size*2;

вопрос не в том что Вы делаете, а для чего изменяете переменную того объекта, который Вам больше не понадобится ?

Цитата(toxx @  3.4.2010,  22:50 Найти цитируемый пост)
2.Так вродебы это не прямая рекурсия, а косвенная...какие слова я знаю ухх

ну а что меняет ? 

Цитата(toxx @  3.4.2010,  22:50 Найти цитируемый пост)
4.Мне нужна будет сортировка массива, вношу быструю сортировку с разделением

сортировка не является методом вектора.. Она должна быть внешней  функцией.


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


Опытный
**


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

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



Цитата

что за удаление/создание внутри push_backa?

Код

void Vector<T> ::push_back(T new_item)
{
    if(capacity<=n)
    {
        Vector buf=*this;
        n++;
        buf.resize(n);
        buf[n-1]=new_item;
        buf.swap(*this);
    }
}

блин, вот и блин...
А рекурсия не идет в методе?или я совсем чтото затупил...

Это сообщение отредактировал(а) toxx - 4.4.2010, 00:12
PM MAIL   Вверх
mes
Дата 4.4.2010, 00:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(toxx @  3.4.2010,  23:07 Найти цитируемый пост)
блин, вот и блин...


прежде всего будьте проще :

Код

void vector::push_back (T const& new_item)
{
      if ( size() = capacity() ) reserve ( capacity() * 2 );

      (*this)[m_size++] = new_item;
}

smile

Это сообщение отредактировал(а) mes - 4.4.2010, 00:25


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


Опытный
**


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

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



Код

void Vector<T>::resize(size_t new_size)
{
    if(capacity<new_size&&n<new_size)
    {
        Vector buf(new_size);
        buf.capacity=new_size*2;

        for(size_t i=0;i<n;i++)
            buf[i]=(*this)[i];

        buf.swap(*this);
    }
}


Про сортировку понял...

Добавлено @ 00:30
у меня  reserve нету =(

ну у меня тоже красиво выгрядит push_back...
я себя прям чувствую совсем бесполезным на фоне вашей логики=(
А можно хотябы пузырьковую как метод добавить?или одельно только совсем?

Это сообщение отредактировал(а) toxx - 4.4.2010, 00:32
PM MAIL   Вверх
mes
Дата 4.4.2010, 00:32 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Код

void vector::resize (size_t new_size)
{
    if ( new_size <= size() ) return;

    if ( new_size > capacity() )
            reserve ( capacity() * 2 );
         
    while  ( m_size != new_size )
          (*this)[m_size++] = T();
}


Добавлено @ 00:33
Цитата(toxx @  3.4.2010,  23:26 Найти цитируемый пост)
у меня  reserve нету =(

ну так кто мешает добавить ?

Добавлено @ 00:39
Код

void Vector::reserve (size_t new_cap)
{
     if (new_cap <= capacity() ) return;
      
     Vector tmp;

     tmp.m_data = new T[new_cap];
     tmp.m_capacity = new_cap;     
     tmp.m_size = m_size;
  
     for (size_t i=0; i<m_size; ++i)
        (*tmp)[i] = (*this)[i];

     tmp.swap (*this);
     
}


Добавлено @ 00:40
Цитата(toxx @  3.4.2010,  23:26 Найти цитируемый пост)
на фоне вашей логики

к сожалению не моей.. я ее когда-то подсмотрел )

Добавлено @ 00:41
Цитата(toxx @  3.4.2010,  23:26 Найти цитируемый пост)
А можно хотябы пузырьковую как метод добавить?или одельно только совсем?

зачем его как метод добавлять ?

Добавлено @ 00:42
P.S. код писал здесь и не проверял..к тому же сейчас ночь - могут быть ошибки.. я просто передавал суть..  так что внимательней  smile


Это сообщение отредактировал(а) mes - 4.4.2010, 10:21


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


Опытный
**


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

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



Добавлено @ 00:50
mes
Охх спасибо за эти советы вроде бы разобрался в том что вы скинули...
код вродебы простой, но меня не посещают пока такие строки =(

...Пока разбирался и искал что такое reserve() вы ушли =)

Это сообщение отредактировал(а) toxx - 4.4.2010, 01:36
PM MAIL   Вверх
mes
Дата 4.4.2010, 10:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(toxx @  3.4.2010,  23:42 Найти цитируемый пост)
и искал что такое reserve()

reserve() отвечает за capacity
resize()    отвечает за size

на будущее, если захотите вектор довести до ума, то еще неплохо бы посмотреть, на функции
uninitialized_copy и uninitialized_fill
http://cplusplus.com/reference/std/memory/...itialized_copy/
http://cplusplus.com/reference/std/memory/...itialized_fill/

и разобраться что представляет из себя аллокатор
http://cplusplus.com/reference/std/memory/allocator/

Это сообщение отредактировал(а) mes - 4.4.2010, 10:30


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


Опытный
**


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

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



Цитата(mes @ 4.4.2010,  10:30)
Цитата(toxx @  3.4.2010,  23:42 Найти цитируемый пост)
и искал что такое reserve()

reserve() отвечает за capacity
resize()    отвечает за size

на будущее, если захотите вектор довести до ума, то еще неплохо бы посмотреть, на функции
uninitialized_copy и uninitialized_fill
http://cplusplus.com/reference/std/memory/...itialized_copy/
http://cplusplus.com/reference/std/memory/...itialized_fill/

и разобраться что представляет из себя аллокатор
http://cplusplus.com/reference/std/memory/allocator/

Да я всё нашел smile 
И еще у вас в коде я увидел некоторые, я бы сказал для себя фишки например
1.
Код

while  ( m_size != new_size )
       (*this)[m_size++] = T();

как я понимаю это отсюда
Код

template <class T>

Но в чем отличие?Для себя я уяснил что это тоже самое, как для любого типа занулить?
только почему не (*this)[m_size++] = T, а именно Т()?
2. в этойже строчке (*this)[m_size++]  m_size++  увеличивается прям в []? вродебы как пост инкремент...
Сам я боюсь использовать такую конструкцию, боюсь что неверный результат будет стараюсь делать это за квадртаными скобками.
Еще нашел, что приоритет у [] выше чем у m_size++, получается что выполняется сначала в цикле для m_size а в следующем цикле для увеличенного m_size на 1.
PM MAIL   Вверх
mes
Дата 4.4.2010, 12:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(toxx @  4.4.2010,  10:54 Найти цитируемый пост)
= T, а именно Т()?

ну так а в чем отличие к примеру между int и int() знаете ? в одном случае имя типа, а в другом создание объекта.

Цитата(toxx @  4.4.2010,  10:54 Найти цитируемый пост)
Сам я боюсь использовать такую конструкцию, боюсь что неверный результат будет стараюсь делать это за квадртаными скобками.

"не уверен не обгоняй" ©  - пока делайте за скобками, как прочувствуете  эту операцию, перестанете бояться smile

Цитата(toxx @  4.4.2010,  10:54 Найти цитируемый пост)
Еще нашел, что приоритет у [] выше чем у m_size++,

приоретет сказывается на разбор команды,  но не на ее выполнение.
Особенность постинкремента (а также постдекремента) в том, что результатом будет значение до его изменения..
smile





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


Опытный
**


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

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



Проверил все эти новшества на своём дереве, что-то перемудрили походу с функциями
resize() reserve()
mes 
p.s. скажите, пожалуйста только за что отвечает эта ошибка?
Ошибка
PM MAIL   Вверх
mes
Дата 4.4.2010, 18:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(toxx @  4.4.2010,  17:48 Найти цитируемый пост)
скажите, пожалуйста только за что отвечает эта ошибка?

она говорит о том, что выходите за  границы памяти.. т.е пишите не куда положено... smile


Цитата(toxx @  4.4.2010,  17:48 Найти цитируемый пост)
что-то перемудрили походу с функциями
resize() reserve()


ну показывайте код вектора, посмотрим чего там перемудренно 
smile


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


Опытный
**


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

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



mes
Только не говорите пожалуйста, я сам попробую

Код

using namespace std;
template <class T>
class Vector
{
    T* V;
    size_t n;
    size_t capacity_m;
public:
    Vector(size_t=0);
    Vector(const Vector&);

    size_t size(){return n;}
    void reserve(size_t );
    size_t begin(){return 0;}
    size_t end(){return n;}
    size_t capacity(){return capacity_m;}

    Vector& erase(size_t);
    void swap (Vector& );
    void push_back(T);
    void resize(size_t);
    
    ~Vector(){delete V;}

    T& operator[](size_t);
};
template <class T>
void Vector<T>::swap(Vector& Vect)
{
    std::swap (V,  Vect.V);
    std::swap (n,  Vect.n);
    std::swap (capacity_m,  Vect.capacity_m);
}
template <class T>
Vector<T>::Vector(const Vector& Vect)
{
    n=Vect.n;
    capacity_m=Vect.capacity_m;
    V=new T[capacity_m];
    for(size_t i=0;i<n;i++)
        (*this)[i]=Vect.V[i];
}
template <class T>
T& Vector<T>::operator [](size_t i)
{
    if(i<n) return V[i]; 
    throw out_of_range("vector index");
}
template <class T>
Vector<T>::Vector(size_t new_size)
{
    n=new_size;
    capacity_m=new_size;
    V=new T[new_size];
    for(size_t i=0;i<new_size;i++)
        (*this)[i]=T();
}
template <class T>
Vector<T>& Vector<T> ::erase(size_t k)
{
    if(k>=n)throw out_of_range("vector index");
    Vector buf=*this;
    n--;
    delete[] V;
    V=new T[n];
    for(size_t i=0;i<n;i++)
    if(i!=k)(*this)[i]=buf[i];
    else 
    {
        (*this)[i]=buf[i+1];
        k++;
    }
}
template <class T>
void Vector<T> ::push_back(T new_item)
{
    if ( size() == capacity() ) reserve ( capacity() * 2 );
      (*this)[n++] = new_item;
}
template <class T>
void Vector<T>::resize(size_t new_size)
{
    if ( new_size <= size() ) return;
    if ( new_size > capacity() )
            reserve ( capacity() * 2 );
         
    while  ( n != new_size )
          (*this)[n++] = T();
}

template <class T>
void Vector<T>::reserve (size_t new_cap)
{
     if (new_cap <= capacity() ) return;
      
     Vector buf;
     buf.V = new T[new_cap];
     buf.capacity_m = new_cap;     
     buf.n = n;
  
     for (size_t i=0; i<n; ++i)
        buf[i] = (*this)[i];
     buf.swap (*this);   
}

PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

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

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

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

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


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

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


 




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


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

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