从lambda访问for_each迭代器

fis*_*ood 4 c++ lambda stl erase-remove-idiom c++11

是否可以访问std :: for_each迭代器,因此我可以使用lambda从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??? );
    }
);
Run Code Online (Sandbox Code Playgroud)

我读过关于使用[](typename T :: value_type x){delete x; 这里是SO,但是VS2010似乎不喜欢这个语句(将T作为错误源加下划线).

Jam*_*lis 8

您使用的是错误的算法.用途remove_if:

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

STL算法不允许您访问用于迭代的迭代器.在大多数情况下,这是一件好事.

(另外,考虑一下你是否真的想要使用std::list它;它不太可能是你的用例的正确容器.考虑一下std::vector,你将使用擦除/删除成语来删除满足特定谓词的元素.)