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

Поиск:

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


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


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

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



Цитата(toxx @  4.4.2010,  18:06 Найти цитируемый пост)
Только не говорите пожалуйста, я сам попробую

ну я только слегка подскажу..  smile

функция erase не вызывает переаллокации и никак не влияет на вместимость, она только удаляет (затирает) ненужный элемент.



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


Опытный
**


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

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



А я нашел...)))
Нужно добавить:
Код

delete[] V;
V=new T[new_size];  

Память массива не увеличивалась, но цикл шел и обнулял до новой помяти=)
Код

void Vector<T>::resize(size_t new_size)
{
    if ( new_size <= size() ) return;
    if ( new_size > capacity() )
            reserve ( capacity() * 2 );
    delete[] V;
    V=new T[new_size];  
    while  ( n != new_size )
          (*this)[n++] = T();
}


Добавлено через 4 минуты и 13 секунд
или не нашел...

Добавлено через 7 минут и 20 секунд
А если убрать в erase()
Код

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

То тоже работает, да верно этот метод я не трогал с последних советов ИванМ
А щас нужно измить слегка с учетом новых методов.
PM MAIL   Вверх
mes
Дата 4.4.2010, 19:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(toxx @  4.4.2010,  18:23 Найти цитируемый пост)
Нужно добавить:

а вызов reserve() на что ?


Цитата(toxx @  4.4.2010,  18:23 Найти цитируемый пост)
А щас нужно измить слегка с учетом новых методов. 

вообще то новые методы на функционал erase не влияют ..



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


Опытный
**


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

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



mes
Тогда странно, если не влияют я при удалении вершин использую только erase() 
Код

void Tree::remove()
{
    for(size_t i=0;i<Trees.size();)
    if (Trees[i]->Trees.size()%2!=0)
    {
        delete Trees[i];
        Trees.erase(i);    
    }
    else 
    {
        Trees[i]->remove();
        ++i;
    }
}

Еще также использую resize() при создании дерева.
Да, я понимаю что reverse() вместо этих строк
Код

delete[] V;
V=new T[new_size];  

Но если они присутствуют всё работает =)
PM MAIL   Вверх
mes
Дата 4.4.2010, 21:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(toxx @  4.4.2010,  18:44 Найти цитируемый пост)
Но если они присутствуют всё работает =) 

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

Вот сейчас просмотрел и бросилось в глаза

Цитата(toxx @  4.4.2010,  18:23 Найти цитируемый пост)
    if ( new_size > capacity() )
            reserve ( capacity() * 2 );


а должно быть, и об этом уже писалось :
Код

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

хотя нужность коэффициента при resize сомнительна, и мне кажется, что он необходим при "шаговом" заполнении, т.е. при push_back.



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


Опытный
**


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

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



mes
Да, без изменений признаю.Но как говорится доверяй, но проверяй.Я предварительно проверил на различных массивах и с использованием методов разных.
Всё работало.Так бы эта ошибка и была, только сегодня я решил опробовать обновлённый вектор на моей лабораторной(ну вот стукнуло).
Там совсем другая структура ( дерево n- мерное).
И ошибка памяти... Сначала посмотрел, нашел где ошибка ...  ну приблизительно.
Менял несколько раз этот resize(), потом только решил обратиться.Так, что чуть что, я не пишу пост просто так...

А насчет метода reserve() я как раз вчера нашел(как раз, то что вы пишите), что он эффективен только если мы добавляем элементы методом push_back.
Выделили приблизительно сколько нам нужно памяти и добавляем.
PM MAIL   Вверх
mes
Дата 4.4.2010, 22:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(toxx @  4.4.2010,  21:20 Найти цитируемый пост)
А насчет метода reserve() я как раз вчера нашел(как раз, то что вы пишите), что он эффективен только если мы добавляем элементы методом push_back.

это в случае предварительного вызова reserve () "из вне".. а я говорил о случаях вызова reserve самим вектором при нехватки памяти..
smile


Цитата(toxx @  4.4.2010,  21:20 Найти цитируемый пост)
Менял несколько раз этот resize(), потом только решил обратиться.

ну так последнее замечание помогло ? или еще есть ошибка?
советую сделать функцию vector_debug (..) выводящая все необходимые данные массива, в том числе и вместимость
и  поиграться с вектором, передавая его после каждого крупного измения на вывод - сразу будет видно на какой функции ошибка и где нестыковки..

Добавлено @ 22:31
кстати.. Внутри вектора Вы используете (*this)[] хотя в большинстве случаев логичней использовать блок данных напрямую, то есть V[].
ну а также хотелось бы показать на отсутствие вызова деструктора у объектов контейнера, что в принципе на текущем этапе не серьезно..

Добавлено @ 22:35
Цитата(toxx @  4.4.2010,  21:20 Найти цитируемый пост)
Да, без изменений признаю

ну тогда ловите и стирание :
Код

void Vector<T> ::erase(size_t idx)
{
    if (idx >= m_size) throw out_of_range("vector index");

    m_size--;

    for (size_t i=idx; i<m_size; ++i)   V[i] = V[i+1];
}


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


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


Опытный
**


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

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



mes
Да, работает Спасибо=)

Я также тестировал вчера предложенные вами функции smile (только у меня это всё сделано cout<<.... в main'e все параметры выводит)
Там ничего не было...Другое дело сегодня заменил старые функции при работе с деревьями и понеслось как говориться =)

Еще я параллельно читал Страуструпа у него есть в книге "Язык программирования С++ спец. изд."
Очень интересная глава "Безопасность исключений и стандартная библиотека"
Так вот в ней я подсмотрел перегрузку оператора []
Код

T& Vector<T>::operator [](size_t i)
{
    if(i<n) return V[i]; 
    throw out_of_range("vector index");
}


Также прочитал (гарантии с контейнерами) и обратил внимание, что у вектора какието слабые гарантии либо прочерки вообще стоят
Там в виде таблицы для vector deque list map
PM MAIL   Вверх
mes
Дата 4.4.2010, 23:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(toxx @  4.4.2010,  21:44 Найти цитируемый пост)
подсмотрел перегрузку оператора []

у стандартного вектора доступ посредством [] не контролирует границ, а для контролируемого доступа есть функция at().



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


Опытный
**


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

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



mes
Вот откуда вы берёте информацию?
Вы так уверенно говорите как будто у вас перед глазами эта библиотека smile (просто поражает в положительном смысле)
Или же вы уже имели дело с её написанием?

Ведь действительно это функция at(size_t i)...

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


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


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

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



Цитата(toxx @  4.4.2010,  22:14 Найти цитируемый пост)
Вот откуда вы берёте информацию?

при столкновении с вопросами по стл в первую очередь лезу в документацию на сайте cplusplus.com

Цитата(toxx @  4.4.2010,  22:14 Найти цитируемый пост)
как будто у вас перед глазами эта библиотека

ну вектор это самое простое из стл, его фактически все знают.

Цитата(toxx @  4.4.2010,  22:14 Найти цитируемый пост)
Или же вы уже имели дело с её написанием?

так же как и Вы проходил написание собственного векторного велосипеда плюс имеется небольшой опыт работы с с стл.
smile

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


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

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

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

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

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


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

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


 




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


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

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