1

我使用 QT 并有一个向量和一个 QVBoxLayout 填充小部件。用AddButton 填充两者都没有问题,但删除它们并没有真正起作用。

如果我从最后一个到第一个删除小部件,一切正常,但是当我尝试以任何其他方式删除它们时,一切都会失败。也许有人有想法?

void listwindow::remove_entry()
{
 vector<todo_list_entry *>::iterator pos;

 int i=0;
 for (pos=list_entrys_vector.begin();pos<=list_entrys_vector.end();pos++)
 {
  if((**pos).check_delete()==true)
  {
   listenLayout->removeWidget(*pos);
   listenLayout->update();
   list_entrys_vector.erase(pos);
   delete list_entrys_vector[i];
   break;
  }
  i++;
 }
} 
4

2 回答 2

0

您可能会遇到迭代器失效的问题,因为erase在迭代它时使用向量的元素。一旦你这样做list_entrys_vector.erase(pos)pos它就不再是一个有效的迭代器,所以当你下次尝试通过循环使用它时,就会发生不好的事情。在迭代时不要对向量的每个单独元素使用擦除,而是等到结束并使用list_entrys_vector.clear().

或者,如果您不想删除所有条目,请使用remove_ifand的组合来执行此操作erase。如果f是一个函数,它接受一个条目并返回true是否应该删除它,你可以这样做。

pos = std::remove_if(list_entrys_vector.begin(),list_entrys_vector.end(),f);

现在,您要删除的条目位于向量的末尾,并且 pos 指向应该删除的第一个条目。然后,您可以对这些条目执行其他操作,然后执行

list_entrys_vector.erase(pos,list_entrys_vector.end());

还有其他方法可以做到这一点,但要记住的关键是在迭代向量时不能从向量中删除元素。如果你想这样做,你必须使用类似std::list.

于 2012-10-24T19:07:01.177 回答
0

我把它改成了这个,现在看起来vector erease工作得很好,但是listenLayout给我带来了一些麻烦......如果我添加4个元素并删除第一个,我只能看到3和4,删除4后2突然出现……

void listwindow::remove_entry()
{
 vector<todo_list_entry *> buffer_vector;
 vector<todo_list_entry *>::iterator pos;


 for ( pos = list_entrys_vector.begin(); pos != list_entrys_vector.end(); ) {
    if((**pos).check_delete()==true) {
       delete * pos;
       pos = list_entrys_vector.erase(pos);
       listenLayout->removeWidget(*pos);
       listenLayout->update;
    }
    else {
       ++pos;
    }
 }

编辑:更改了顺序(首先删除小部件,然后删除)现在一切正常!

于 2012-10-25T13:58:40.837 回答