使用multiset :: iterator反复擦除会导致出现“访问冲突读取位置”

时间:2018-10-18 20:18:17

标签: c++ stdmap multiset

我已经使用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从集中擦除时,调试器将中断。

此外,我一次仅删除一个已有元素,然后将其添加回去,那么可能是什么原因触发了访问冲突?任何建议,将不胜感激,谢谢!

0 个答案:

没有答案