是否可以访问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??? );
}
);
我读过关于使用[](typename T :: value_type x){delete x;这里是SO,但是VS2010似乎不喜欢这个语句(将T作为错误源加下划线)。
答案 0 :(得分:8)
您使用的是错误的算法。使用remove_if
:
EventQueue.remove_if([&](EventPtr const& pEvent)
{
return pEvent->EventType() == evt.EventType();
});
STL算法不允许您访问用于迭代的迭代器。在大多数情况下,这是一件好事。
(另外,请考虑您是否真的想要使用std::list
;它不太可能是您的用例的正确容器。请考虑std::vector
,使用{{1}}删除满足特定谓词的元素。)
答案 1 :(得分:2)
不,请使用常规代替。
for( auto it = EventQueue.begin(); it != EventQueue.end(); ++it )
{
auto pEvent = *it;
if( pEvent->EventType() == evt.EventType() )
it = EventQueue.erase( it );
);
答案 2 :(得分:0)
并不是唯一需要从lambda了解迭代器的情况。 为了更一般地做到这一点,我使用&运算符(隐式转换为迭代器)是这样的:
int main (int argc, char* argv []) {
size_t tmp [6] = {0, 1, 2, 3, 4, 5};
std::list<size_t> ls ((size_t*)tmp, (size_t*) &tmp [6]);
//printing next element
std::for_each ((const size_t*)tmp, (const size_t*) &tmp [5], [] (const size_t& s) {
std::cout << s << "->";
std::cout << *(&s +1) << " ";
});
std::cout << std::endl;
}