- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
for (std::vector<SomeClass::SmartPtr>::iterator i = candidates.begin ();
i != candidates.end (); )
{
if ((*i)->getArea ().intersect (thisArea))
{
// label is inside the area.
++i;
}
else
{
// label must be removed
std::iter_swap (i, candidates.end () - 1);
candidates.pop_back ();
}
}
Вот, для интов работает. Если я не пропустил нигде какой-то скрытый UB, значит проблема связана со спецификой SomeClass или SmartPtr
Iterators, pointers and references referring to other elements that have not been removed are guaranteed to keep referring to the same elements they were referring to before the call. (c)
я таким же трюком пользуюсь когда несортированый набор в векторе/массиве лежит. поиска быстрого нету - но там где это мне нужно 4х-5х экономия памяти по сравнению с std::set.
и вот таким незамысловатым образом можно из несортированого вектора удалить элемент из середины за О(1): скопировать на его место последний элемент, размер вектора уменьшить на единицу.