законность итератора, после стирания () звонят в станд.:: набор

В идеальном мире Вы могли сцепить события мутации. У меня есть сомнения, что они работают надежно даже над браузерами стандартов. Это кажется, что Вы уже реализовали событие мутации, таким образом, Вы могли возможно добавить это для использования собственного события мутации, а не опроса тайм-аута на браузерах, которые поддерживают тех.

я видел реализации DOM-изменения, которые наблюдают изменения путем сравнения document.body.innerHTML для длительности сохраненный .innerHTML, который не точно изящен (но работы). Так как Вы в конечном счете собираетесь проверить, был ли определенный узел добавлен уже, то Вы более обеспечены просто проверка что каждое прерывание.

Улучшения, о которых я могу думать, являются использованием .offsetParent, а не .parentNode, поскольку это, вероятно, сократит несколько родителей из Вашего цикла (см. комментарии). Или использование compareDocumentIndex() на всех кроме IE и тестирование .sourceIndex propery для IE (должен быть-1, если узел не находится в DOM).

Это могло бы также помочь: X браузеров compareDocumentIndex implementaion John Resig .

10
задан Satbir 28 October 2009 в 11:07
поделиться

3 ответа

Поскольку вы, очевидно, удаляете все элементы набора, вы можете просто сделать:

    for (SETTYPE::iterator itr2=li.begin();itr2!=li.end();itr2++) 
    {
            classA *lt=(classA*)(*itr2);
            delete lt;
    }
    li.clear(); // clear the elements
2
ответ дан 3 December 2019 в 13:24
поделиться

From standard 23.1.2

The insert members shall not affect the validity of iterators and references to the container, and the erase members shall invalidate only iterators and references to the erased elements.

EDIT

In your case itr2 is invalidated after erasing so incrementing it causes undefined behaviour. In this case you can follow reko_t advice, in general, you can try this:

for (SETTYPE::iterator itr2=li.begin();itr2!=li.end();) 
{
    classA *lt=(classA*)(*itr2);
    li.erase(itr2++); 
    delete lt;
}

which will increment iterator before removing it's previous value from set.
Кстати. itr2 аннулируется не delete lt; , а li.erase (itr2);

41
ответ дан 3 December 2019 в 13:24
поделиться

Удаление в порядке.

Проблема в том, что вы стираете - и таким образом сделать недействительным - itr2 , но использовать его для итерации цикла.

iaw после первого стирания,

7
ответ дан 3 December 2019 в 13:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: