在multiset中删除

时间:2013-09-21 09:30:02

标签: c++ stl iterator erase multiset

我是STL容器的新手,现在我在使用Multiset时遇到了一些问题。 问题在于以下两个集合:

vector<DataReference*> referenceCol;
multiset<DataCount, DataCountSortingCriterion> orderedCol;

orderedCol保留了一些具有两个公共整数字段的数据元素:id和count。我用count元素命令那个结构。我可能需要从这些元素递增和递减count字段,因此,为了维护排序,我使用第二个集合(referenceCol),它由id字段索引并保存一个引用(迭代器)到orderedCol集合,所以每当我需要刷新计数时,我可以快速擦除orderedCol中的元素(通过在referenceCol中引用它),刷新它,然后根据顺序将其重新插入到适当的位置。

referenceCol是在我的类的构造函数中创建的,有两个字段:validReference(bool),指示迭代器引用是否有效,以及multiset&lt; ....&gt; :: iterator变量。< / p>

以下方法处理影响这两个集合的递增和递减操作:

void SomeClass::decrementCount(int index)
{
    multiset<DataCount, DataCountSortingCriterion>::iterator it = referenceCol[index]->it;
    DataCount dop = *it;
    orderedCol.erase(it);   

    dop.count--;
    if (dop.count > 0) {
        it = orderedCol.insert(dop);
        referenceCol[index]->it = it;
    }
    else {
        referenceCol[index]->validRef = false;
    }
}

void SomeClass::incrementCount(int index)
{
    DataCount dop;
    multiset<DataCount, DataCountSortingCriterion>::iterator it;


    if (referenceCol[index]->validRef) {
        it = referenceCol[index]->it;
        dop = *it;

        orderedCol.erase(it); <--------- BOOM!
        dop.count++;
    }
    else {
        dop.id = index;
        dop.count = 1;

        referenceCol[index]->validRef = true;
    }

    it = orderedCol.insert(dop);
    referenceCol[index]->it = it;
}

问题是当我尝试在增量操作中擦除迭代器时遇到错误(从代码中查看BOOM注释)。 我遇到的错误是:

“map / set erase iterator outside range”

我发生的唯一事情就是可能在擦除元素时我可能使其他迭代器无效,所以那些引用不再存在,但我用谷歌搜索它,我发现对于multiset,擦除操作只会使擦除元素但没有其他元素...... 我还检查了在我的运行示例中,我没有用有问题的索引擦除元素。

请帮忙!抱歉我的英语不好! 哦,我愿意接受有关更好的策略的建议,以便按顺序完成元素的“刷新”:)

提前致谢!

1 个答案:

答案 0 :(得分:0)

只有你给我们调试的代码我无法确定,但我怀疑你是在调用decrementCount(index)referenceCol[index]->validReffalse。发生这种情况时,您的decrementCount方法只需在迭代器上调用erase而不检查有效性。 如果在以前无效的迭代器上发生这种情况,您可能会看到您所看到的行为。

除此之外,您似乎应该使用多图而不是多集。但是,如果不理解你的所有代码,我肯定不会这么说。