3

リストの要素を消去する方法と、その消去が有効な反復子を返す方法を知っています。私の問題は、1 つの要素だけでなく複数の要素を削除したいということです。

実際、私のコードは次のようなものです

 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は機能しません。イテレータを変更する方法はわかりませんが、この反復ステップにとどまります。

読んでくれてありがとう。誰かが答えを知っていることを願っています。

4

2 に答える 2

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);
于 2013-08-18T08:39:02.520 に答える