c++ - 多重删除

标签 c++ stl iterator erase multiset

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

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

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

referenceCol 是在我的类的构造函数中创建的,它有两个字段:指示迭代器引用是否有效的 validReference (bool) 和 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 注释)。 我遇到的错误是:

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

我唯一想到的是,当删除元素时,我可能会使其他迭代器失效,所以那些引用不再有效,但我用谷歌搜索,我发现对于多重集,删除操作只会使删除元素而不是其他元素...... 我还检查了在我的运行示例中我没有删除索引有问题的元素。

求助!对不起我的英语不好! 哦,我乐于接受有关按顺序完成元素“刷新”的更好策略的建议 :)

提前致谢!

最佳答案

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

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

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

相关文章:

c++ - glLoadMatrixf 似乎不起作用

c++ - vector 的 emplace_back

c++ - 使用 vector 的函数崩溃,调试器说访问冲突读取位置

c# - 什么是 C# 迭代器和生成器,我该如何使用它们

c++ - 使用 find() 通过 std::set 的迭代器将不起作用。出了什么问题?

使用 c++ 类,以便在实例化时产生编译错误

c++ - boost 程序选项短/长参数名称

c++ - QTcpSocket真的是全双工吗?

c++ - 通过指定成员的值删除 `std::set` 的成员

c++ - vector 未显示正确的元素