从std :: set中迭代并擦除元素

Rug*_*rra 2 c++ iterator set erase

我有一个std::set,我需要擦除相似的相邻元素:

DnaSet::const_iterator next = dna_list.begin();
DnaSet::const_iterator actual = next;
++next;

while(next != dna_list.end()) // cycle over pairs, dna_list is the set
{
    if (similar(*actual, *next))
    {
        Dna dna_temp(*actual);  // copy constructor
        dna_list.erase(actual); // erase the old one
        do
        {
           dna_temp.mutate(); // change dna_temp
        } while(!dna_list.insert(dna_temp).second);  // insert dna_temp
    }
    ++actual;
    ++next;
}
Run Code Online (Sandbox Code Playgroud)

有时程序无法退出主循环.我认为当我擦除中的最后一个元素时会发生问题dna_list.执行此任务的正确方法是什么?

Pet*_*der 5

使用actual = next而不是++actual.

一旦擦除actual,它就是一个无效的迭代器,所以++actual会表现得很奇怪.next应保持完好,所以分配actualnext应该工作.