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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> pop_back 
:(
    Опции темы
knut
Дата 7.12.2010, 23:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Добрый день.
есть class hTreeItem.
Код


template <class T>
class hTreeItem{
....
std::vector<hTreeItem*> _children;
....
public:
  hTreeItem* push_back(hTreeItem* item);
  hTreeItem* push_back(const T& data) { return push_back( new hTreeItem<T>(this, data) ); }
}


Код

template <class T>
hTreeItem<T>* hTreeItem<T>::push_back(hTreeItem<T>* item)
{
  if( !item ) throw std::runtime_error("[push_back] Cannot insert NULL item.");
  item->_parent = this;
  _children.push_back( item );
  return item;
}

как мне реализовать  pop_back
делаю так.
Код

template<class T>
void hTreeItem<T>::pop_back(hTreeItem<T>* root,std::vector<T>* item)
{
    
    int iPos = 0;
    typename std::vector<T>::iterator it_;
    it_ = item->end()-1;
        while( iPos < root->size() )
        {
          hTreeItem<T> *item_ = root->getAt(iPos);
          if(item_->data() == (*it_))
          {
                delete(item_);
          }
         iPos++;
        }
         iPos = 0;
}

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






--------------------
Цитата

Многие вещи нам непонятны не оттого, что наши понятия слабы, а оттого, что данные вещи не входят в круг наших понятий.
PM MAIL   Вверх
mes
Дата 8.12.2010, 00:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(knut @  7.12.2010,  22:00 Найти цитируемый пост)
 hTreeItem* push_back(hTreeItem* item);
  hTreeItem* push_back(const T& data) { return push_back( new hTreeItem<T>(this, data) ); }

нехорошо иметь различное поведение.. 
Цитата(knut @  7.12.2010,  22:00 Найти цитируемый пост)
но структура нарушается. и мне не нравится то что я зделал. 
как решить правельно?

что значит "нарушается структура" ? что не нравится ? и какое поведение ожидаете от pop_back`a ?
особенно учитывая что push_back мог создать объект, а мог принять чужой..


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


Опытный
**


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

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



mes.
Код

class hTreeItem{
  typedef std::vector<hTreeItem*> tagItems;
  typedef typename tagItems::iterator tagItemsIter;
  typedef typename tagItems::const_iterator tagItemsIterC;
private:
  T _data;
  hTreeItem *_parent;
  std::vector<hTreeItem*> _children;
   ......


public:
  
  hTreeItem* push_back(hTreeItem* item);
  hTreeItem* push_back(const T& data) { return push_back( new hTreeItem<T>(this, data) ); }

  void pop_back(hTreeItem<T>* root,std::vector<T>* item);


вот пуш

Код

template <class T>
hTreeItem<T>* hTreeItem<T>::push_back(hTreeItem<T>* item)
{
  if( !item ) throw std::runtime_error("[push_back] Cannot insert NULL item.");
  item->_parent = this;
  _children.push_back( item );
  return item;
}


а вот поп


Код

template<class T>
void hTreeItem<T>::pop_back(hTreeItem<T>* root,std::vector<T>* item)
{
    int iLevel = 0;
    int iPos = 0;
    hTreeItem<T> *p_current;
    typename std::vector<T>::iterator it_;
    it_ = item->end()-1;
        while( iPos < root->size() )
        {
          hTreeItem<T> *item_ = root->getAt(iPos);
          if(item_->data() == (*it_))
          {
              //delete (it_);
              //std::cout<<item_->data()<<endl;
              if(item_->m_bHasAccess ==  false)
              {
                delete(item_);
              }
          }
        iPos++;
        }
         iPos = 0;
}


вроде обект удаляется но  есть метод outTree каторый выводит дерьево.

Код

template <class T>
void outTree(hTreeItem<T>* root, int iLevel, int iPos)
{
  if( root )
  {
    outSpace( iLevel ); cout << root->data() << endl;
    if( iPos < root->size() ) outTree( root->getAt(iPos), iLevel + 1,0 );
    iPos++;
    while( iPos < root->size() )
    {
      hTreeItem<T> *item = root->getAt(iPos);
      if( item )
        outTree( item , iLevel + 1, 0 );
      iPos++;
    }
  }
}




что значит "нарушается структура" ? что не нравится ? и какое поведение ожидаете от pop_back`a ?
что значит "нарушается структура" -  обект нормально не удаляется.
и какое поведение ожидаете от pop_back`a ? - коректно удатилть обект.

тест 
Код

hTreeItem<std::string>  intItem(NULL,"1");
hTreeItem<std::string> *p, *p1;
string thisstring = "1/11/12";
intItem.StringExplode(thisstring, "/", &R);

intItem.push_back("11");
p = intItem.push_back("12");
  
p->push_back("121");
p->push_back("122");
p->push_back("123");

p1 = p->push_back("124");
p1 = p1->push_back("1241");
p1->push_back("12411");
p->push_back("125");
p->push_back("126");
intItem.pop_back(&intItem,&R);


т.е получается дерьево у катой вид след.
1
 11
 12
     121
     122
     123
....

так вот pop_back передаем все дерьево и путь 1/11/12 он должен удалить каталог '12'.










--------------------
Цитата

Многие вещи нам непонятны не оттого, что наши понятия слабы, а оттого, что данные вещи не входят в круг наших понятий.
PM MAIL   Вверх
mes
Дата 8.12.2010, 18:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(knut @  8.12.2010,  17:12 Найти цитируемый пост)
и какое поведение ожидаете от pop_back`a ? - коректно удатилть обект.

это не поведение, а результат..

читать подобный код, мне лично не охота :

Цитата(knut @  8.12.2010,  17:12 Найти цитируемый пост)
  int iLevel = 0;
    int iPos = 0;
    hTreeItem<T> *p_current;
    typename std::vector<T>::iterator it_;
    it_ = item->end()-1;
        while( iPos < root->size() )
        {
          hTreeItem<T> *item_ = root->getAt(iPos);
          if(item_->data() == (*it_))
          {
              //delete (it_);
              //std::cout<<item_->data()<<endl;
              if(item_->m_bHasAccess ==  false)
              {
                delete(item_);
              }
          }
        iPos++;
        }
         iPos = 0;


поэтому и спрашивал о поведении .. 
smile



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


Опытный
**


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

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



mes.
извини если что то не так.
просто я не могу додумать как мне поп реализовать?


--------------------
Цитата

Многие вещи нам непонятны не оттого, что наши понятия слабы, а оттого, что данные вещи не входят в круг наших понятий.
PM MAIL   Вверх
mes
Дата 8.12.2010, 20:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(knut @  8.12.2010,  18:25 Найти цитируемый пост)
просто я не могу додумать как мне поп реализовать? 

ну так для начала словами сформулируйте, что он должен делать smile
и сразу легче будет написать код smile



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


Опытный
**


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

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



делаю дерьево на подобие как в эксплорере.три
зделал пуш теперь хочу сделать поп метод.
пуш у меня работает так.
вот пуш
Код

template <class T>
hTreeItem<T>* hTreeItem<T>::push_back(hTreeItem<T>* item)
{
  if( !item ) throw std::runtime_error("[push_back] Cannot insert NULL item.");
  item->_parent = this;
  _children.push_back( item );
  return item;
}

Код

hTreeItem<std::string>  intItem(NULL,"1"); // зделал рут
hTreeItem<std::string> *p, *p1;

intItem.push_back("11");
p = intItem.push_back("12"); // здесь уже следуюшая вставка т.е создание каталога будет в '12' ветке.
p->push_back("121");
p->push_back("122");
p->push_back("123");
и т.д


так вот задача.
как реализовать pop . т.е  если у меня след. строка '1/11/12' т.е  мне надо в этом случайе удалить из дерьева '12' ветку.


--------------------
Цитата

Многие вещи нам непонятны не оттого, что наши понятия слабы, а оттого, что данные вещи не входят в круг наших понятий.
PM MAIL   Вверх
mes
Дата 8.12.2010, 21:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(knut @  8.12.2010,  19:12 Найти цитируемый пост)
пуш у меня работает так.

т.е. словами никак ? 
smile
дело в том, что когда сформулируйте сразу увидите где ошибка smile

Добавлено @ 21:28
ну немножко разберем Ваш код.. 

Цитата(knut @  8.12.2010,  17:12 Найти цитируемый пост)
template<class T>
void hTreeItem<T>::pop_back(hTreeItem<T>* root,std::vector<T>* item)

для чего root и для чего vector<T> ?


Цитата(knut @  8.12.2010,  17:12 Найти цитируемый пост)

    int iLevel = 0;
    int iPos = 0;
    hTreeItem<T> *p_current;
...
  iPos++;
        }
         iPos = 0;

 для чего ?


Цитата(mes @  8.12.2010,  17:29 Найти цитируемый пост)
 typename std::vector<T>::iterator it_;
    it_ = item->end()-1;
        while( iPos < root->size() )

a почему не так :
Код

if (item->size())
  for (..::iterator it; it!=item->end(); ++it)

да и для чего в pop_backe проверять детей ? они должны удаляться в деструкторе..


Цитата(mes @  8.12.2010,  17:29 Найти цитируемый пост)
if(item_->data() == (*it_))
          {
              //delete (it_);
              //std::cout<<item_->data()<<endl;
              if(item_->m_bHasAccess ==  false)
              {
                delete(item_);
              }
          }


tтут опять непонятно  зачем...



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


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


Опытный
**


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

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



спасибо mes.
+1


--------------------
Цитата

Многие вещи нам непонятны не оттого, что наши понятия слабы, а оттого, что данные вещи не входят в круг наших понятий.
PM MAIL   Вверх
xvr
Дата 9.12.2010, 13:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(knut @  8.12.2010,  20:12 Найти цитируемый пост)
как реализовать pop . т.е  если у меня след. строка '1/11/12' т.е  мне надо в этом случайе удалить из дерьева '12' ветку
Странный у вас 'pop'  smile Я бы сказал, что не 'pop' он вообще, а даже скорее 'erase'.


PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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