我知道如何擦除列表中的元素,并且擦除返回有效的迭代器。我的问题是,我想删除的不仅仅是一个元素而是多个元素。
Actuall我的代码就像
for(list<Treenode*>::iterator it=currentLevel->begin(); it!=currentLevel->end(); ++it){
if(something(*it)) {
for(list<Treenode*>::iterator it2=currentNewLevel->begin();it2!=currentNewLevel->end();){
if (somethingDifferent(*it2)) {
it2=currentLevel->erase(it2);
} else {
++it2;
}
}
}
}
当然这不起作用,因为it
没有改变。我不知道如何更改迭代器但是继续这个迭代步骤。
感谢您的阅读。我希望有人知道答案。
答案 0 :(得分:4)
通常,根据条件从列表中删除元素的方法是使用std::list::remove_if
成员函数。
bool pred(const Treenode* t) { .... }
currentNewLevel.remove_if(pred);
谓词可以是一个仿函数,因此它可以保留实现删除标准所需的任何状态:
#include <algorithm> // for std::find_if
#include <list>
// unary predicate functor. Returns true if an element of a reference
// list satisfies "something" and the functor call argument satisfies "somethingDifferent"
struct Pred
{
Pred(const std::list<Treenode*>& nodes) : nodes_(nodes) {}
bool (const Treenode* t) const
{
return std::find_if(nodes_.begin(), nodes_.end(), something) != nodes_.end() &&
somethingDifferent(t);
}
private:
const std::list<Treenode*>& nodes_;
};
然后
Pred p(currentLevel);
currentLevel.remove_if(p);
答案 1 :(得分:0)
执行while循环。它也大多是++,因此性能应该不错。
std::vector<PdfTextRegion*>::const_iterator textRegion = m_pdfTextRegions.begin();
while(textRegion != m_pdfTextRegions.end())
{
if ((*textRegion)->glyphs.empty())
{
m_pdfTextRegions.erase(textRegion);
textRegion = m_pdfTextRegions.begin();
}
else
textRegion++;
}