0

我正在尝试在没有太多特殊情况代码的情况下执行以下操作来处理无效的 POSITION 等:

填空的最佳方法是什么?

void DeleteUnreferencedRecords(CAtlMap<Record>& records)
{
   for(____;____;____)
   {
      if( NotReferencedElsewhere(record) )
      {
        // Delete record
        _______;
      }
   }
}
4

3 回答 3

2

根据这个:

http://msdn.microsoft.com/en-us/library/0h4c3zkw(VS.80).aspx

RemoveAtPos 具有这些语义

删除存储在指定位置的键/值对。用于存储元素的内存被释放。pos 引用的 POSITION 变得无效,虽然 map 中任何其他元素的 POSITION 仍然有效,但它们不一定保持相同的顺序。

问题是顺序可以改变——这意味着 GetNext() 不会真正继续迭代。看起来您需要一次收集要删除的 POSITION,然后在下一次删除它们。删除一个 POSITION 不会使其他 POSITION 对象无效

于 2008-10-13T18:31:21.483 回答
0

我的第一个想法是在调用之前保存当前位置GetNext,然后,如果你删除元素,你可以重置它。但是,也许最安全的方法是创建一个包含您要保留的元素的新地图,否则您可能依赖于 POSITION 的内部实现如何工作。

于 2008-10-13T10:35:04.597 回答
0

我不太熟悉CAtlMap,但如果它类似于 STL 的map类型,那么Rob 的“第一个想法”是安全的——删除一个项目不会影响任何迭代器,除了指向被删除项目的迭代器。

于 2008-10-13T15:47:33.827 回答