0%

Range based's erase on C++

看到了Eraser iterators這篇不發表一下文章實在對不起作者啊
把Erase的痛點都寫出來了
在Range based loop要Erase只有以下兩種方法

1
2
3
4
5
6
7
8
9
10
11
for (auto it = array.begin(); it != array.end();)
{
if (*it == delete)
{
it = array.erase(it);
}
else
{
it++;
}
}

或者是

1
2
3
4
5
6
7
array.erase(std::remove_if(array.begin(), array.end(),
[](auto& item)
{
bool deleting = condition;
return deleting;
}
), array.end());

第一種很直覺,不過跟C++11提倡的Range based loop算是一種退化
而第二種出現了4個array,一不小心還會有打錯字的風險
天才作者提出了第三種方式

1
2
3
4
5
for (auto& item : iter::eraser(array))
{
if (*item == value) // Access item via deref
item.mark_for_erase(); // Item is marked for deletion, but is still valid until end of loop iteration
}

非常漂亮的解法!