在多集中擦除
Erase in multiset
我是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 注释)。我遇到的错误是这样的:
"映射/设置擦除迭代器超出范围"
我唯一想到的是,也许在擦除元素时,我可能会使其他迭代器无效,因此这些引用不再成立,但我用谷歌搜索了一下,我发现对于多集,擦除操作只会使擦除元素无效,而没有其他元素......我还检查了在我的运行示例中,我没有擦除带有问题索引的元素。
请帮忙!对不起,我的英语不好!哦,我愿意接受有关更好策略的建议,以实现元素的"刷新"以:)
提前感谢!
只有您提供给我们调试的代码,我无法确定,但我怀疑您正在调用decrementCount(index)
,以便referenceCol[index]->validRef
false
。发生这种情况时,您的 decrementCount 方法只是在迭代器上调用 erase 而不检查有效性。如果这发生在以前无效的迭代器上,您可能会看到您所看到的行为。
顺便说一句,您似乎应该使用多重映射而不是多重集。但是,如果不了解您的所有代码,我不能肯定地说。
- 引用一个已擦除类型(void*)的指针
- 擦除while循环中迭代的元素
- 在运行时处理类型擦除的数据-如何不重新发明轮子
- C++擦除(如果存在)
- 在映射擦除c++期间执行循环的次数
- 为什么擦除方法会影响结束方法
- C++ 字符串类擦除成员函数的时空复杂性
- 类型擦除的std::function与虚拟函数调用的开销
- C++14 中unordered_map矢量和擦除删除成语的奇怪行为
- C++ 擦除函数中需要澄清
- 循环挂起迭代的 std::擦除 on std::list
- 擦除许多矢量元素,同时使用'auto'
- 如何擦除冗余输入?
- C++ STL 设置按值擦除
- 如何在C++中允许成员函数的自定义返回类型进行类型擦除?
- 为什么我的向量::擦除调用会抛出"vector subscript out of range"?
- 如何在写入文件时擦除最后一个逗号
- C++:std::ofstream 方法 open() 在第二次迭代时擦除打开的 ifstream 文件
- 双链表的擦除值函数,未知错误
- 在多集中擦除