在std :: list上的splice()和迭代器无效
时间:2020-03-06 14:49:12 来源:igfitidea点击:
list :: splice()的3个参数形式将单个元素从一个列表移动到另一个列表。 SGI的文档明确指出,所有迭代器,包括指向要移动的元素的迭代器,都保持有效。 Roguewave的文档没有提及任何关于splice()
方法的迭代器失效属性的信息,而C ++标准明确声明它使所有迭代器和对要拼接的元素的引用失效。
splicing()实际上按SGI的定义工作,但是我在Microsoft STL实现的调试/安全SCL版本(严格遵循标准的字母)中得到断言失败(取消引用无效的迭代器)。
现在,我之所以使用list正是因为我想在列表之间移动元素,同时保留指向它的迭代器的有效性。该标准对原始SGI的规范进行了极其无益的更改。
我该如何解决此问题?还是我应该务实,将自己的头埋在沙子里(因为在实践中,拼接不会使迭代器无效-即使在MS的实现中,一旦关闭迭代器调试,也不会无效)。
解决方案
好的,根据此链接,这似乎是标准中的缺陷。似乎"固步自封"是一个好策略,因为它将在新的库版本中修复。
问题是,如果迭代器仍指向已移动的元素,则先前与"已移动"迭代器关联的"结束"迭代器已更改。除非我们编写一些复杂的循环,否则这实际上是一件不好的事情-尤其是因为其他开发人员很难理解。
我认为更好的方法是使用迭代器指向移动的迭代器之前和之后的元素。
我有一个列表数组(元素的等价类),并且我正在使用拼接在列表之间移动元素。我还有一个迭代器数组,它使我可以直接访问任何列表中的任何元素并将其移动到另一个列表。没有一个列表同时被搜索和修改。我可以在拼接后重新初始化元素迭代器,但这有点丑陋。.我想我暂时会这样做。