本来是个很简单的遍历删除的问题,但是因为vector的机制,在连续释放空间时,会导致出错。自己思考无非是倒序删除,或者使用earse的返回值,感觉都有些别扭,不是我想要的精巧。所以打算在网上搜个精巧简短的代码直接用。找来找去,终于在Stack overflow上找到了这段代码,实测很好用,正是我想找的。
其实还有一种,remove-erase的方式,但我不是很喜欢。我认为下面这种方式更加高效,通用。
代码
满足Condition()的元素会被删除。Execution() 释放Deferred资源。
const auto pred = [](Deferred& d){ return !d.Condition(); };
auto itMatch = std::partition( defs.begin(), defs.end(), pred);
const auto action = [](Deferred& d){ d.Execution(); };
std::for_each(itMatch, defs.end(), action);
defs.erase(itMatch, defs.end());
上述是不保证稳定性的排序方法,需要保证稳定性的话,可以使用stable_partition代替partition。
const auto pred = [](Deferred& d){ return !d.Condition(); };
auto itMatch = std::stable_partition( defs.begin(), defs.end(), pred);
const auto action = [](Deferred& d){ d.Execution(); };
std::for_each(itMatch, defs.end(), action);
defs.erase(itMatch, defs.end());