5

std::for_each イテレーターにアクセスできるので、ラムダを使用して std::list から現在の要素を消去できます (以下のように)

typedef std::shared_ptr<IEvent>    EventPtr;
std::list<EventPtr> EventQueue;
EventType evt;
...

std::for_each( 
    EventQueue.begin(), EventQueue.end(),

    [&]( EventPtr pEvent )
    {
        if( pEvent->EventType() == evt.EventType() )
            EventQueue.erase( ???Iterator??? );
    }
);

[](typename T::value_type x){ delete x; の使用について読みました。ここでは SO ですが、VS2010 ではこのステートメントが気に入らないようです (エラー ソースとして T に下線が引かれています)。

4

3 に答える 3

8

間違ったアルゴリズムを使用しています。使用remove_if

EventQueue.remove_if([&](EventPtr const& pEvent)
{
    return pEvent->EventType() == evt.EventType();
});

STLアルゴリズムでは、反復に使用されているイテレーターにアクセスできません。ほとんどの場合、これは良いことです。

(さらに、本当に使用したいかどうかを検討std::listしてください。これがユースケースに適したコンテナーである可能性は低いです。特定の述語を満たす要素を削除するために、 erase / removeイディオムstd::vectorを使用することを検討してください。)

于 2012-06-28T14:29:51.793 に答える
1

いいえ、代わりに通常の for を使用してください。

for( auto it = EventQueue.begin(); it != EventQueue.end(); ++it )
{
  auto pEvent = *it;
  if( pEvent->EventType() == evt.EventType() )
      it = EventQueue.erase( it );
);
于 2012-06-28T14:26:16.167 に答える