c++ - 成批删除

  显示原文与译文双语对照的内容
0 0

我是新的STL容器,现在我正在使用Multiset的一些问题。 问题有以下两个集合:


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

orderedCol mantains一些具有两个 public 整型字段的数据元素: 我正在按计数元素排序那个结构。 为了维护排序,我可能需要从元素中增加和减少计数字段,为了保持排序,我使用第二个集合( referenceCol ),在id字段中,我们会根据排序的顺序对元素进行索引,并在适当位置重新插入它。

referenceCol在类的构造函数中创建,并且有两个字段: 指示迭代器引用是否有效的validReference ( bool ),以及 multiset <。 >:: 迭代变量。

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


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注释) 中的迭代器时,我有一个错误。 我所遇到的错误是:

"映射/设置在范围外删除迭代器"

对于我来说,除了删除它的他迭代器,也许这些引用不再存在,但是我搜索了。 我还在运行的示例中检查了,我不会用有问题的索引擦除元素。

请帮忙对不起,我的英语不好。 哦,我打开了关于完成元素"刷新"的更好策略的建议:

提前致谢!

时间: 原作者:

0 0

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

除了这里,你似乎应该使用一个多重映射而不是多重数组。 但是又不理解你的所有代码我不能肯定。

原作者:
...