Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > pop_back


Автор: knut 7.12.2010, 23:00
Добрый день.
есть 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;
}

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




Автор: mes 8.12.2010, 00:34
Цитата(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 мог создать объект, а мог принять чужой..

Автор: knut 8.12.2010, 18:12
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'.








Автор: mes 8.12.2010, 18:29
Цитата(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

Автор: knut 8.12.2010, 19:25
mes.
извини если что то не так.
просто я не могу додумать как мне поп реализовать?

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

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

Автор: knut 8.12.2010, 20:12
делаю дерьево на подобие как в эксплорере.три
зделал пуш теперь хочу сделать поп метод.
пуш у меня работает так.
вот пуш
Код

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' ветку.

Автор: mes 8.12.2010, 21:16
Цитата(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тут опять непонятно  зачем...


Автор: knut 8.12.2010, 23:01
спасибо mes.
+1

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


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)