我是 STL 容器的新手,现在我在使用 Multiset 时遇到了一些问题。问题在于以下两个集合:
vector<DataReference*> referenceCol;
multiset<DataCount, DataCountSortingCriterion> orderedCol;
orderedCol 维护一些具有两个公共整数字段的数据元素:id 和 count。我按计数元素订购该结构。我可能需要从该元素中增加和减少 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 注释)。我遇到的错误是这样的:
“映射/设置擦除迭代器超出范围”
我唯一想到的是,也许在擦除元素时我可能会使其他迭代器无效,所以这些引用不再存在,但我用谷歌搜索了它,我发现对于多集,擦除操作只会使擦除元素无效,但是没有其他人......我还检查了在我运行的示例中我没有擦除有问题的索引的元素。
请帮忙!对不起我的英语不好!哦,我愿意接受有关按顺序完成元素“刷新”的更好策略的建议:)
提前致谢!