Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从矢量和QVBoxLayout中删除_C++_Qt_Vector - Fatal编程技术网

C++ 从矢量和QVBoxLayout中删除

C++ 从矢量和QVBoxLayout中删除,c++,qt,vector,C++,Qt,Vector,我使用QT,有一个向量和一个充满小部件的QVBoxLayout。用Add按钮填充这两个按钮是没有问题的,但是删除它们并不能真正起作用 如果我从最后一个到第一个删除小部件,一切正常,但当我尝试以任何其他方式删除它们时,一切都失败了。也许有人有主意 void listwindow::remove_entry() { vector<todo_list_entry *>::iterator pos; int i=0; for (pos=list_entrys_vector.begin

我使用QT,有一个向量和一个充满小部件的QVBoxLayout。用
Add
按钮填充这两个按钮是没有问题的,但是删除它们并不能真正起作用

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

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++;
 }
} 
void listwindow::remove_entry()
{
向量::迭代器位置;
int i=0;
for(pos=list_entrys_vector.begin();posremoveWidget(*pos);
listenLayout->update();
列表入口向量擦除(pos);
删除列表项向量[i];
打破
}
i++;
}
} 

在对向量元素进行迭代时,对向量元素使用
erase
可能会导致迭代器无效。一旦执行
list\u entrys\u vector.erase(pos)
pos
不再是一个有效的迭代器,因此当您下次尝试在循环中使用它时,会发生不好的事情。不要在迭代过程中对向量的每个单独元素使用擦除,而是等到结束时,使用
list\u entrys\u vector.clear()立即擦除它们

或者,如果您不想删除所有条目,可以使用
remove\u if
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

的方法。我将其更改为此,现在向量erease似乎工作得很好,但listenLayout给了我一些麻烦le…如果我添加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;
    }
 }
void listwindow::remove_entry()
{
向量缓冲区;
向量::迭代器位置;
对于(pos=list_entrys_vector.begin();pos!=list_entrys_vector.end();){
如果((**pos).选中_delete()==true){
删除*pos;
pos=列表入口向量擦除(pos);
listenLayout->removeWidget(*pos);
listenLayout->update;
}
否则{
++pos;
}
}
编辑: 改变了顺序(先移除Widget,然后删除),现在一切都很好