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

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


orderedCol包含一些具有两个公共整数字段的数据元素:id和count。我正在按count元素排序该结构。我可能需要从该元素增加和减少count字段,因此,为了维持顺序,我使用了第二个集合(referenceCol),该集合由id字段建立索引并保存对orderedCol的引用(迭代器)集合,所以每当我需要刷新计数时,我都可以快速删除orderedCol中的元素(通过在referenceCol中对其进行引用),刷新它,然后根据顺序将其再次插入其适当的位置。

referenceCol是在我的类的构造函数中创建的,具有两个字段:validReference(布尔值)(用于指示迭代器引用是否有效)和multiset :: iterator变量。

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

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注释)。
我遇到的错误是这样的:

“映射/设置擦除迭代器超出范围”

我发生的唯一事情是,也许在擦除元素时,我可能会使其他迭代器无效,因此这些引用不再适用,但是我用Google搜索了一下,发现对于多集,擦除操作只会使擦除元素无效,但是没有其他人...
我还检查了我正在运行的示例中,我没有删除有问题的索引的元素。

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

提前致谢!

最佳答案

仅凭您提供给我们的代码进行调试就无法确定,但我怀疑您正在调用decrementCount(index),以使referenceCol[index]->validReffalse。发生这种情况时,您的decrementCount方法将简单地在迭代器上调用clear而不检查有效性。
如果这是在以前无效的迭代器上发生的,则您可能会看到自己所看到的行为。

顺便说一句,您似乎应该使用的是多图而非多图。但是同样,在不理解您所有代码的情况下,我不能肯定地说。

关于c++ - 多组擦除,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18931058/

10-09 03:49