- 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 ();
}
}
Soul_re@ver 21.02.2014 16:48 # 0
Soul_re@ver 21.02.2014 20:55 # −1
Вот, для интов работает. Если я не пропустил нигде какой-то скрытый UB, значит проблема связана со спецификой SomeClass или SmartPtr
Bobik 24.02.2014 20:25 # +2
guest 11.03.2014 16:05 # +1
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)
Bobik 11.03.2014 18:33 # 0
Dummy00001 21.02.2014 23:18 # +3
я таким же трюком пользуюсь когда несортированый набор в векторе/массиве лежит. поиска быстрого нету - но там где это мне нужно 4х-5х экономия памяти по сравнению с std::set.
и вот таким незамысловатым образом можно из несортированого вектора удалить элемент из середины за О(1): скопировать на его место последний элемент, размер вектора уменьшить на единицу.
petia 25.08.2021 19:32 # 0