我已经使用std::multiset<int>
实现了“优先级队列”,并使用std::map<int, multiset<int>::iterator>
加快了擦除速度。
以下是我使用多重集和映射的代码段:
std::multiset<RankInfo> ranklist;
std::map<int, multiset<RankInfo>::iterator> rankMap;
std::vector<int> list;
int main () {
// Inserting procedure
RankInfo rank;
//...etc to initialize rank
auto iter = ranklist.insert(rank);
vrankMap.insert(std::pair<VertexPairID, std::multiset<VPairRanking>::iterator>(rank.ID, iter));
...etc
// Pop procedure
std::multiset<RankInfo>::iterator least = ranklist.begin();
RankInfo info = *least;
ranklist.erase(rankMap[ID]);
rankMap.erase(info.ID);
// Update rank procedure
for (int i = 0; i < list.size(); i++) {
if (needsUpdate()) {
ranklist.erase(rankMap[i]);
rankMap.erase(i);
RankInfo rank;
auto iter = ranklist.insert(rank);
vrankMap.insert(std::pair<VertexPairID, std::multiset<VPairRanking>::iterator>(i, iter));
}
}
}
这用于网格简化,我在其中加载输入模型。 此问题仅在我用于测试的某些模型上发生(我已经验证了模型本身没有问题)。
从https://www.sigmainfy.com/blog/how-c-iterator-is-really-affected-by-erase-vector-vs-list.html读取内容可以消除我的担忧,即delete()操作不会影响其他迭代器值,因为它们类似于指针。
vector<int> list
是一个向量,我不改变其大小;最初添加一些元素后,我不会擦除或插入更多元素。因此,此向量的索引将用作ranklist和rankMap的“ ID”。
使用调试器,当我使用set::iterator
从集中擦除时,调试器将中断。
此外,我一次仅删除一个已有元素,然后将其添加回去,那么可能是什么原因触发了访问冲突?任何建议,将不胜感激,谢谢!